OAuth2 и PKCE — средство проверки кода недействительноJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 OAuth2 и PKCE — средство проверки кода недействительно

Сообщение Anonymous »

Я создаю Java-приложение, в котором пытаюсь реализовать поток авторизации OAuth2 для API (Etsy.com), который требует PKCE (ключ подтверждения для обмена кодом). Я пытаюсь уже некоторое время, но при обмене кода доступа для токена OAuth все время возникает следующая ошибка:

Код: Выделить всё

{"error":"invalid_grant","error_description":"code_verifier is invalid"}
Вот метод создания исходного URL-адреса, куда передается верификатор в кодировке sha256:

Код: Выделить всё

@Override
public String getOAuth2AuthorizationUrl() {

String sha256hex = null;
try {
if(_currentVerifier == null)
_currentVerifier = PkceUtil.generateCodeVerifier();

MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] encodedhash = digest.digest(
_currentVerifier.getBytes(StandardCharsets.UTF_8));
sha256hex = new String(encodedhash);
} catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}

UnicodeEscaper basicEscaper = new PercentEscaper("-", false);
System.out.println("sha256="+sha256hex);
System.out.println("veri="+_currentVerifier);

String oAuth2AuthorizationUrl = super.getOAuth2AuthorizationUrl();
var authUrl = oAuth2AuthorizationUrl
+"&state=asdf&code_challenge_method=S256&code_challenge='"
+ basicEscaper.escape(sha256hex)+"'";
return authUrl;
}
Затем я отправляю запрос на обмен кода на токен в виде POST-запроса application/x-www-form-urlencoded:

Код: Выделить всё

    UnicodeEscaper basicEscaper = new PercentEscaper("-", false);
var params = "grant_type=authorization_code&client_id="
+token.getOwner().clientId+"&redirect_uri="
+basicEscaper.escape("https://localhost")
+"&code="+accessCode+"&code_verifier="+basicEscaper.escape(_currentVerifier)+"";
Я пробовал много вариантов, также пробовал заключить значения в '' и т. д., но ничего не помогло. Я неправильно понял этот процесс? Сначала я отправляю строку sha256, а при запросе токена OAuth2 отправляю закодированное значение.
Есть идеи?
Обновление:
Я попробовал использовать библиотеку Google для генерации хеша, но все равно получаю ту же ошибку.

Код: Выделить всё

Hasher hasher = Hashing.sha256().newHasher();
hasher.putString(CODE_VERIFIER, Charsets.UTF_8);
HashCode sha256 = hasher.hash();

System.out.println("veri="+AppUtils.encodeBase64(AppUtils.toHexString(sha256.asBytes())));

String oAuth2AuthorizationUrl = super.getOAuth2AuthorizationUrl();

var authUrl = oAuth2AuthorizationUrl
+"&state=asdf&code_challenge_method=S256&code_challenge="+AppUtils.encodeBase64(AppUtils.toHexString(sha256.asBytes()));
return authUrl;
Кроме того, формат параметра code_challenge в примерах выглядит по-другому.

Подробнее здесь: https://stackoverflow.com/questions/697 ... is-invalid
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»