Auth0 - 无法验证代码验证程序错误

时间:2018-06-01 18:52:22

标签: go oauth-2.0 auth0 pkce

我正在编写一个脚本,该脚本使用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 Forbidden 403 ...

{"错误":" 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)

但我总是得到:

{"错误":" invalid_grant"," error_description":"无法验证代码验证程序"}

1 个答案:

答案 0 :(得分:0)

我遇到了实现Auth0 PKCE的错误:

{
    "_id" : ObjectId("5b115e00a186ae19062b0714"),
    "id" : 86164014,
    "cost" : 3,
    "created_date" : "2017-04-04 21:44:14",
    "quantity" : 12,
    "bill_id" : 46736603,
    "product_id" : 24,
    "bill_date" : "2017-04-04",
    "district_id" : 75
    "city_id": 21
}

就我而言,错误是由于在授权URL和令牌交换中意外发送了不同的验证程序引起的。我对已调用的授权URL和令牌交换请求正文进行了一些记录,以确定这一点,并建议您也这样做。

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

值得注意的是,您不必手动替换{"error":"invalid_grant","error_description":"Failed to verify code verifier"} +,因为Go使用/代替base64.URLEncoding支持此操作,如下所示:

StdEncoding

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