Auth0 - не удалось проверить код проверки Ошибка
Я пишу скрипт, который использует auth0 для аутентификации с помощью удаленного API.
После этого учебника: https://auth0.com/docs/api-auth/tutorials/authorization-code-grant-pkce
import (
"crypto/rand"
"crypto/sha256"
"encoding/base64"
"strings"
)
func genAuth0CodeVerifierChallance() (string, string) {
// Generate random Code Verifier
c := make([]byte, 32)
rand.Read(c)
code := base64.StdEncoding.EncodeToString(c)
code = strings.Replace(code, "+", "-", -1)
code = strings.Replace(code, "/", "_", -1)
code = strings.Replace(code, "=", "", -1)
// Generate auth0 challange
ch := sha256.Sum256([]byte(code))
challange := base64.StdEncoding.EncodeToString(ch[:])
challange = strings.Replace(challange, "+", "-", -1)
challange = strings.Replace(challange, "/", "-", -1)
challange = strings.Replace(challange, "=", "", -1)
return code, challange
}
Я использую эту функцию, чтобы генерировать вызов кода, например eQM2dqasJN3-gXcM0g1Se-CmAn8PyU7c5uHRKU7Exa0
Я делаю пост HTTP с полезной нагрузкой
p := &payloadData{
GrantType: "authorization_code",
ClientId: "...............................", (removed)
CodeVerifier: codeChallenge,
Code: code, (example: AuL3ArApgQ4QDu_9)
RedirectUri: "http://127.0.0.1:16272/oauth/token",
}
...marshal json...
req, _ := http.NewRequest("POST", "https://my-app.eu.auth0.com/oauth/token", bytes.NewBuffer(payload))
Я получаю ошибку:
{403 Запрещено 403...
{"error":"invalid_grant","error_description":"Не удалось проверить верификатор кода"}
В других ссылках на это сказано, что символы не были должным образом закодированы / заменены в вызове base64.
Я попытался с помощью следующих двух кодировок для /
code = strings.Replace(code, "+", "-", -1)
code = strings.Replace(code, "/", "_", -1)
code = strings.Replace(code, "=", "", -1)
а также
code = strings.Replace(code, "+", "-", -1)
code = strings.Replace(code, "/", "-", -1)
code = strings.Replace(code, "=", "", -1)
Но я всегда получаю
{"error":"invalid_grant","error_description":"Не удалось проверить верификатор кода"}
1 ответ
Я столкнулся с той же ошибкой, реализующей Auth0 PKCE:
{"error":"invalid_grant","error_description":"Failed to verify code verifier"}
В моем случае ошибка была вызвана случайной отправкой разных верификаторов в URL-адресе авторизации и в Token Exchange. Я выполнил некоторую регистрацию как URL авторизации, так и тела запроса Token Exchange, чтобы выяснить это и рекомендовать вам сделать то же самое.
У меня есть рабочая демонстрационная реализация, которую вы можете попробовать. Это HTTP-сервер, а не нативное приложение, но он успешно выполняет потоки PKCE.
Следует отметить, что вам не нужно заменять вручную +
а также /
так как Go поддерживает это с помощью base64.URLEncoding
вместо StdEncoding
следующее:
strings.Trim(base64.URLEncoding.EncodeToString(data), "=")
В дополнение к документации Auth0, дополнительная информация о PKCE OAuth 2.0 в IETF RFC-7636: