Открытые ключи для 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-step-2
Загрузите и сохраните соответствующий открытый веб-ключ JSON (JWK) для вашего пула пользователей.Он доступен как часть набора веб-ключей JSON (JWKS).Вы можете найти его по адресу https://cognito -idp . {Регион} .amazonaws.com / {userPoolId} /. Хорошо известный / jwks.json
Parseключи и проверочный токен
Эта файловая структура 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 используйте поле "kid" из заголовка JWT, чтобы найти правильный ключиспользовать
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()
})