0

我正在编写一个脚本,它使用 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":"验证码验证失败"}

4

1 回答 1

0

我在实现 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 的更多信息:

于 2018-06-02T07:33:16.113 回答