我使用AdminInitiateAuth
(AWS SDK for Go)获得了Cognito访问令牌服务器端,我将其存储在会话cookie中。我假设我需要在每个后续请求中验证该令牌。我是否需要针对每个请求呼叫Cognito,还是可以在应用服务器端验证令牌?
答案 0 :(得分:2)
“ OpenID是一种分散式身份验证协议”,因此,由于采用了非对称的 RSA 方法,因此无需查询数据库服务器或Cognito服务器即可对其进行验证。
我在使用OpenID令牌时遇到了同样的问题。我正在使用Cognito注册以登录和注册我的用户。最初,我可以使用API网关身份验证器对它们进行授权而没有问题,但后来我决定将其移至Kubernetes后端。
我发现的最好的主意来自: How to verify a JWT Token from AWS Cognito in Go?线程
中的一个很好的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库验证它们。
阅读&#34;在Web API中使用ID令牌和访问令牌&#34;上面给出的链接部分。
并且确定,因为它是JWT,所以您不需要为每个请求调用Cognito。只需验证令牌。