我正在编写一个脚本,该脚本使用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":"无法验证代码验证程序"}
答案 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的更多信息: