Я пытаюсь подключиться к API Asana с помощью OAuth. У меня все остальное работает нормально, но когда я пытаюсь использовать PKCE, он не работает.
Сначала я создаю верификатор кода. После некоторого поиска в Google у меня есть вот такой код.
$code_verifier = rtrim(strtr(base64_encode(random_bytes(64)), '+/', '-_'), '=');
Я отправляю это на биржу токенов. Затем я хеширую это, кодирую в base64url и передаю на запрос авторизации из браузера.
$hashed = hash('sha256', $code_verifier, true);
$code_challenge = rtrim(strtr(base64_encode($hashed), '+/', '-_'), '=');
$url = $asana_client->dispatcher->oauthClient->getAuthenticationUrl(
OAuthDispatcher::$AUTHORIZATION_ENDPOINT,
$asana_client_redirect_url,
array(
'state' => $state,
'code_challenge' => $code_challenge,
'code_challenge_method' => 'S256'
)
);
$result = $asana_client->dispatcher->oauthClient->getAccessToken(
OAuthDispatcher::$TOKEN_ENDPOINT,
'authorization_code',
array(
'code' => $_GET['code'],
'redirect_uri' => $asana_client_redirect_url,
'code_verifier' => $current_verifier
)
);
Но я получаю обратно ошибку 400 «неверный грант» с описанием «PKCE code_verifier
не соответствует запросу сохраненного кода».
Как ни странно, если я не отправляю верификатор кода в точку обмена токенов, он работает. Так и должно быть? Мне это кажется странным, но в то же время это довольно большая ошибка, если так не должно быть.
Я делаю что-то неправильно? Все мои поиски в Google и моя собственная двойная проверка создают впечатление, что это то, что я должен делать... любая помощь будет оценена по достоинству.
@cbroe — это то же самое, что и $code_verifier в первой строке кода, которой я поделился. как только пользователь нажимает мою кнопку для аутентификации, он перезагружает страницу, создавая новый $code_verifier. Чтобы отправить на биржу токенов правильный $code_verifier вместо только что созданного, мне нужно сохранить его в другом месте, а затем получить. Отсюда и новая переменная. Мне нужно сделать то же самое с состоянием, и это работает. Когда я отлаживал это, он также отправлял правильный код $code_verifier, так что проблема не в этом. Извините, я не ясно выразился в вопросе
Для всех, кто может найти этот вопрос и найти это полезным... Кажется, CBroe был на правильном пути. Я сохранял верификатор кода для отправки на биржу токенов не в том месте. так что он отправил не тот. теперь все работает
Откуда берется
$current_verifier
?