我有一个使用AdminInitiateAuth
(AWS SDK for Go)的 Cognito 访问令牌服务器端,我将它存储在会话 cookie 中。我假设我需要在每个后续请求中验证该令牌。我是否需要为每个请求调用 Cognito,还是可以在我的应用服务器端验证令牌?
2 回答
“ OpenID 是一种去中心化的身份验证协议”,因此您不必查询数据库服务器或 Cognito 服务器来验证它,因为采用了非对称RSA方法。
我对 OpenID 令牌有同样的问题。我正在使用 Cognito 注册以登录和注册我的用户。最初,我可以毫无问题地使用 API 网关身份验证器对它们进行授权,但后来我决定将其移至 Kubernetes 后端。
我发现的最好的想法来自: How to verify a JWT Token from AWS Cognito in Go?线
以及来自https://github.com/awslabs/aws-support-tools/blob/master/Cognito/decode-verify-jwt/decode-verify-jwt.py的一个很好的 Python 示例
您需要公钥才能验证 JWT 令牌
JWT 令牌具有基于 64 位 URL 编码的 JSON 格式,包含三个字段<header>.<payload>.<signature>
。在有效负载字段中,您可以在尝试进行验证之前找到iss
搜索“孩子”公钥的字段。
testparse := strings.Split(tokenid, ".")
base64decode, err := base64.RawURLEncoding.DecodeString(testparse[1])
fmt.Println("Claims:", string(base64decode))
或者更好地使用“ github.com/dgrijalva/jwt-go ”和“ github.com/lestrrat-go/jwx/jwk ”来做类似的事情:
jwt.Parse(yourTokenStr, getKeyFunction)
然后在你的getKeyFunction()
你可以做:
fmt.Println("Header: Alg:", token.Header["alg"], ", Kid: ", token.Header["kid"])
claims := token.Claims.(jwt.MapClaims)
// Print unverified claims
for key, value := range claims {
log.Printf("%s\t: %v\n", key, value)
if key == "iss" {
// AWS cognito uses /.well-known/jwks.json path for the pub key
jwksURL = value.(string) + "/.well-known/jwks.json"
}
}
...
如果您jwt.Parse(yourTokenStr, getKeyFunction)
不会返回任何错误,则令牌是有效的。
例如,您可以获得的错误是“令牌已过期”或(就我而言)更通用的“ crypto/rsa:验证错误”,如果它是过期的 Token_ID。
由于它是 Json Web Token,您可以使用任何 JWT 库对其进行验证。
阅读上面给出的链接中的“在 Web API 中使用 ID 令牌和访问令牌”部分。
其次,由于它是 JWT,因此您不需要为每个请求调用 Cognito。只需验证令牌。