Делаю авторизацию на сайте с помощью VK ID (Без SDK с обменом кода на бэкенде).
Первую часть авторизации с получением code и device_id прошел успешно.
Когда обращаюсь к методу
https://id.vk.com/oauth2/auth, получаю ошибку :
message:
error: "invalid_request"
error_description: "invalid code_challenge"
здесь указываю url и формирую параметры:
const vk = this.configService.get('vk');
const app = this.configService.get('app');
const { code_verifier, code_challenge } = getVerifier();
const url = 'https://id.vk.com/oauth2/auth';
const params = {
grant_type: 'authorization_code',
code,
device_id,
client_id: vk.appId,
redirect_uri: app.frontend,
code_challenge_method: 's256',
code_verifier,
code_challenge,
};
здесь делаю запрос:
import * as qs from 'qs';
const data = await this.httpService
.post(url, qs.stringify(params), {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
.toPromise();
так формирую code_verifier и code_challenge:
import { randomBytes, createHash } from 'crypto';
import base64url from 'base64url';
export function getVerifier() {
const code_verifier = generateRandomString(45);
const code_challenge = getHash(code_verifier);
return {
code_verifier,
code_challenge,
};
}
function generateRandomString(length = 32) {
const str = randomBytes(length).toString('base64');
return base64URLEncode(str);
}
function getHash(code_verifier: string) {
const hash = createHash('sha256')
.update(code_verifier)
.digest()
.toString('base64');
return base64URLEncode(hash);
}
function base64URLEncode(str: string) {
return base64url.fromBase64(str);
}
Не могу понять, где и что не правильно сделал (не считая того, что вообще занялся авторизацией)