【发布时间】:2017-12-28 20:47:09
【问题描述】:
我有一个使用 AdminInitiateAuth(适用于 Go 的 AWS 开发工具包)的 Cognito 访问令牌服务器端,并将其存储在会话 cookie 中。我假设我需要在每个后续请求中验证该令牌。我是否需要针对每个请求调用 Cognito,还是可以在我的应用服务器端验证令牌?
【问题讨论】:
标签: aws-sdk amazon-cognito aws-cognito aws-sdk-go
我有一个使用 AdminInitiateAuth(适用于 Go 的 AWS 开发工具包)的 Cognito 访问令牌服务器端,并将其存储在会话 cookie 中。我假设我需要在每个后续请求中验证该令牌。我是否需要针对每个请求调用 Cognito,还是可以在我的应用服务器端验证令牌?
【问题讨论】:
标签: aws-sdk amazon-cognito aws-cognito aws-sdk-go
"OpenID 是一种去中心化的身份验证协议" 由于采用了非对称 RSA 方法,因此您不必查询数据库服务器或 Cognito 服务器来验证它。
我在使用 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 字段来搜索“kid”公钥。
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) 不会返回任何错误,则令牌有效。
例如,您可能会遇到的错误是“Token is expired”或(就我而言)更通用的“crypto/rsa: verification error”(如果是)一个过期的 Token_ID。
【讨论】:
由于它是一个 Json Web Token,您可以使用任何 JWT 库来验证它们。
阅读上述链接中的“在 Web API 中使用 ID 令牌和访问令牌”部分。
而且 seconfly,由于它是 JWT,您不需要为每个请求调用 Cognito。只需验证令牌即可。
【讨论】: