Как проверить токен JWT из AWS Cognito в Go? - PullRequest
1 голос
/ 05 июля 2019

Как я могу проверить и получить информацию от JWT, полученного от Amazon Cognito?

Я установил аутентификацию Google в Cognito и установил URI перенаправления, чтобы поразить API Gateway, затем я получил код, который я POST для этой конечной точки:

https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html

Для получения токена JWT в формате RS256. Сейчас я изо всех сил пытаюсь проверить и разобрать токен на Голанге. Я пытался разобрать его с помощью jwt-go, но вместо этого он по умолчанию поддерживает HMAC и где-то читал, что вместо этого они рекомендуют использовать проверку внешнего интерфейса. Я пробовал несколько других пакетов, и у меня были похожие проблемы.

Я наткнулся на этот ответ здесь: Go Language and Verify JWT , но предположим, что код устарел, поскольку он просто говорит panic: unable to find key.

jwt.io может легко расшифровать ключ и, вероятно, тоже проверить. Я не уверен, где находятся открытые / секретные ключи, когда Amazon генерирует токен, но насколько я понимаю, мне нужно использовать URL-адрес JWK для проверки? Я нашел несколько конкретных решений AWS, но все они, кажется, имеют сотни строк. Не правда ли, что на Голанге все не так сложно?

1 Ответ

0 голосов
/ 05 июля 2019

Открытые ключи для 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()        
})
...