【发布时间】:2021-10-03 15:36:51
【问题描述】:
我正在尝试验证从 AWS Cognito(托管 UI)登录返回的 JWT。我注意到,一旦在 cognito 中完成登录,它就会尝试使用“id_token”和“access_token”等参数访问我的应用程序。用jwt.io检查,看起来“id_token”是jwt。
作为测试,我在 GO 中编写了一个 post 函数,期望有一个带有 jwt 令牌和访问令牌的主体(并由此 answer 实现)
func auth(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
keyset, err := jwk.Fetch(context.Background(), "https://cognito-idp.{Region}.amazonaws.com/{poolID}/.well-known/jwks.json")
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode(&model.ErrorResponse{
Response: model.Response{
Result: false,
},
StatusCd: "500",
StatusDesc: "Failed to fetch jwks. Authorization failed.",
Error: "errRes",
})
}
authRequest := &model.AuthRequest{}
json.NewDecoder(r.Body).Decode(&authRequest)
parsedToken, err := jwt.Parse(
[]byte(authRequest.Token), //This is the JWT
jwt.WithKeySet(keyset),
jwt.WithValidate(true),
jwt.WithIssuer("https://cognito-idp.{Region}.amazonaws.com/{poolID}"),
jwt.WithAudience("{XX APP CLIENT ID XX}"),
jwt.WithClaimValue("key", authRequest.Access), //This is the Access Token
)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode(&model.ErrorResponse{
Response: model.Response{
Result: false,
},
StatusCd: "500",
StatusDesc: "Failed token parse. Authorization failed.",
Error: "errRes",
})
}
result := parsedToken
json.NewEncoder(w).Encode(result)
}
我正在使用的包是
"github.com/lestrrat-go/jwx/jwk"
"github.com/lestrrat-go/jwx/jwt"
显然,它在令牌解析时失败了。我做错了什么以及我应该如何处理parsedToken?
我是新手,所以我不知道这是否是正确的方法,并且真的需要一些指导。
【问题讨论】:
-
我不明白这一行
jwt.WithClaimValue("key", authRequest.Access)authRequest.Access 是否评估为“访问”?使用 jwt 作为字符串,您只需 B64 解码即可查看声明的内容,如果不存在,那么至少在适当的地方事情会失败。你应该可以在这里解码它jwt.io 我认为 WithClaimValue 行应该是 key = "token_use" 然后 value 是 "id" 或 "access" -
@NigelSavage 谢谢 - 我将其更改为
jwt.WithClaimValue("token_use", "access")但仍然失败。 -
我建议解码 jwt 令牌并查看声明