Код для создания codeVerifier на бэке:
const codeVerifier = crypto
.randomBytes(CODE_VERIFIER_LENGTH)
.toString('hex');
const sha256 = crypto.createHash('sha256');
const codeChallenge = sha256.update(codeVerifier).digest('base64url');
Далее передаем его на фронт и там обращаеамся в VK, код на фронте:
VKID.Config.init({
app: parseInt(vk_app_id), // Идентификатор приложения.
redirectUrl: window.location.href.split("?")[0], // Адрес для перехода после авторизации.
state, // Произвольная строка состояния приложения.
codeChallenge, // Верификатор в виде случайной строки. Обеспечивает защиту передаваемых данных.
scope: VK_AUTH_SCOPE, // Список прав доступа, которые нужны приложению.
mode: VKID.ConfigAuthMode.InNewTab, // По умолчанию авторизация открывается в новой вкладке.
});
VKID.Auth.login();
Код авторизации по коду:
this.httpService.post<AuthResultDto>(VKID_AUTH_ENDPOINT, {
grant_type: 'authorization_code',
code_verifier: credentials.codeVerifier,
redirect_uri: dto.redirectUrl,
code: dto.code,
client_id: dto.clientId,
device_id: dto.deviceId,
state: credentials.state,
}).then((res) => {
// Сохраняем токены
})