【问题标题】:Auth0 - Failed to verify code verifier ErrorAuth0 - 无法验证代码验证器错误
【发布时间】:2018-11-11 22:54:28
【问题描述】:

我正在编写一个脚本,它使用 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 Post

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":"验证码验证失败"}

【问题讨论】:

    标签: go oauth-2.0 auth0 pkce


    【解决方案1】:

    我在实现 Auth0 PKCE 时遇到了同样的错误:

    {"error":"invalid_grant","error_description":"Failed to verify code verifier"}
    

    在我的情况下,错误是由于在授权 URL 和令牌交换中意外发送了不同的验证器造成的。我对调用的授权 URL 和令牌交换请求正文进行了一些记录,以解决此问题并建议您也这样做。

    我在这里有一个可用的演示实现,你可以试试。这是一个 HTTP 服务器,不是本机应用程序,但它成功地执行了 PKCE 流。

    值得注意的是,您不必手动替换 +/,因为 Go 支持使用 base64.URLEncoding 而不是 StdEncoding,如下所示:

    strings.Trim(base64.URLEncoding.EncodeToString(data), "=")
    

    除了 Auth0 文档之外,还提供了有关 IETF RFC-7636 中的 OAuth 2.0 PKCE 的更多信息:

    【讨论】:

    • 我检查了代码,挑战是一样的。也改成 base64 编码来挑战 := base64.RawURLEncoding.EncodeToString(ch[:]) 谢谢!
    猜你喜欢
    • 2018-09-01
    • 2016-01-16
    • 2011-05-22
    • 2018-10-09
    • 2022-07-25
    • 2018-10-09
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多