pulint
@pulint

Как исправить ошибку «invalid code_challenge» в ВК oauth2 при получении токена?

Делаю авторизацию на сайте с помощью 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);
}

Не могу понять, где и что не правильно сделал (не считая того, что вообще занялся авторизацией)
  • Вопрос задан
  • 116 просмотров
Пригласить эксперта
Ответы на вопрос 1
@russellbakh
Не вижу параметра state (32 bytes), который генерируется на самом первом этапе. Его вроде как тоже надо передавать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы