如何验证从Amazon Cognito收到的JWT并从中获取信息?
我已经在Cognito中设置了Google身份验证,并将重定向uri设置为打API Gateway,然后收到了我发布到此端点的代码:
https://docs.aws.amazon.com/cognito/latest/developerguide/token- endpoint.html
要接收JWT令牌,采用RS256格式。我现在正在努力验证和解析Golang中的令牌。我尝试使用jwt- go解析它,但默认情况下它似乎支持HMAC并阅读他们建议使用前端验证的地方。我尝试了其他一些软件包,并遇到了类似的问题。 但是假设代码已经过时,就像刚才说的那样panic: unable to find key。
panic: unable to find key
jwt.io可以轻松解码密钥,并且可能也进行验证。我不确定公钥/密钥在Amazon生成令牌时的位置,但是据我了解,我也需要使用JWK URL进行验证吗?我找到了一些特定于AWS的解决方案,但它们似乎都长达数百行。当然,在Golang中不是那么复杂吗?
Amazon Cognito的公钥
正如您已经猜到的那样,您将需要公共密钥才能验证JWT令牌。
https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito- user-pools-using-tokens-verifying-a-jwt.html#amazon-cognito-user-pools-using- tokens-第2步
为您的用户池下载并存储相应的公共JSON Web密钥(JWK)。它可作为JSON Web密钥集(JWKS)的一部分使用。您可以在https:// cognito-idp上找到它 。{region} .amazonaws.com / {userPoolId} /。well-known / jwks.json
解析密钥并验证令牌
该JSON文件结构已在网络中记录,因此您可以潜在地手动解析,生成公钥等。
但是只使用一个库可能会更容易,例如,一个库:https : //github.com/lestrrat-go/jwx
然后jwt-go处理JWT部分:https : //github.com/dgrijalva/jwt-go
然后,您可以:
1)使用第一个库下载并解析公共密钥JSON
keySet, err := jwk.Fetch(THE_COGNITO_URL_DESCRIBED_ABOVE)
2)使用jwt-go解析令牌时,请使用JWT标头中的“ kid”字段来找到要使用的正确密钥
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodRS256); !ok { return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) } kid, ok := token.Header["kid"].(string) if !ok { return nil, errors.New("kid header not found") } keys := keySet.LookupKeyID(kid); if len(keys) == 0 { return nil, fmt.Errorf("key %v not found", kid) } return keys[0].Materialize() })