验证Cognito访问令牌服务器端

时间:2017-07-23 01:14:24

标签: aws-sdk amazon-cognito aws-cognito aws-sdk-go

我使用AdminInitiateAuth(AWS SDK for Go)获得了Cognito访问令牌服务器端,我将其存储在会话cookie中。我假设我需要在每个后续请求中验证该令牌。我是否需要针对每个请求呼叫Cognito,还是可以在应用服务器端验证令牌?

2 个答案:

答案 0 :(得分:2)

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令牌具有一个基于base64 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。

答案 1 :(得分:0)

由于它是Json Web Token,您可以使用任何JWT库验证它们。

https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html中解释了令牌结构。

阅读&#34;在Web API中使用ID令牌和访问令牌&#34;上面给出的链接部分。

并且确定,因为它是JWT,所以您不需要为每个请求调用Cognito。只需验证令牌。

相关问题