Как получить временные учетные данные после аутентификации с помощью AWS ALB / Cognito / OIDC IdProvider? - PullRequest
4 голосов
/ 09 июля 2019

У меня настроена встроенная аутентификация ALB с провайдером идентификации OIDC (SalesForce), подключенным через пул пользователей Cognito, более или менее следуя этому руководству .

С этой настройкой мое веб-приложение (на основе Java / Spring Boot) получает заголовки x-amzn-oidc-accesstoken, x-amzn-oidc-identity и x-amzn-oidc-data, перенаправленные ALB.
Я могу анализировать и проверять токены JWT, содержащиеся в этих заголовках, и, например, получать оттуда электронную почту пользователей.

Теперь моя цель - предоставить этому аутентифицированному пользователю доступ к определенным ресурсам или сервисам AWS через AWS JavaScript SDK непосредственно со стороны клиента. Например, я бы хотел, чтобы пользователь мог перечислять объекты в корзине S3 или вызывать определенные лямбда-функции.

Насколько я понимаю, мне нужно как-то сгенерировать временные учетные данные для этого аутентифицированного пользователя. Но я не смог найти конкретную документацию о том, как это сделать. Ближайшие хиты были:

Но я не мог соединить точки там. Я ожидаю, что мне, вероятно, следует каким-то образом использовать заголовки x-amzn-oidc-accesstoken, x-amzn-oidc-identity и x-amzn-oidc-data, но я не смог найти код, который бы это делал.

Итак, мой вопрос: как мне сгенерировать временные учетные данные для пользователя, который был аутентифицирован с помощью встроенной ALB-аутентификации через Cognito с OIDC Identity Provider?

1 Ответ

2 голосов
/ 09 июля 2019

Существует несколько шагов, которые необходимо предпринять для достижения этой цели.

Сначала необходимо создать соответствующую роль IAM, которую вы позволите своим пользователям выполнять.Если вы хотите предоставить S3-доступ своим пользователям, вам нужно настроить роль IAM таким образом и установить доверительные отношения между этой ролью и WebIdentity (если вы идете в консоль -> IAM -> Роли -> Создать роль,вы увидите эту опцию в верхней части экрана - Select type of trusted entity и настройте провайдера на основе вашего фактического провайдера OIDC.

Как только вы получите эту роль, вам нужно будет обменять токен WebIdentity, которым вы в настоящее время обладаетеSTS токен.В вашем случае вам нужно будет вызвать функцию sts.assume_role_with_web_identity (которая является частью SDK), где вам нужно будет указать

  • RoleArn - арн выше созданной роли, которая будет считатьсявашими пользователями
  • RoleSessionName - имя пользователя сеанса (может быть произвольной строкой)
  • WebIdentityToken - токен, совместимый с OIDC (тот, который у вас есть)
  • Duration - как долго возвращенные учетные данные будут действительны

После совершения вызова вы получите ответ, содержащий:

'Credentials': {
    'AccessKeyId': 'string',
    'SecretAccessKey': 'string',
    'SessionToken': 'string',
    'Expiration': datetime(2015, 1, 1)
},
...

Важными частями являются AccessKeyIdSecretAccessKey и SessionToken.Эти временные учетные данные можно использовать для прямого вызова S3, Lambda или любой другой службы AWS из вашего кода, но вам потребуется настроить SDK, который вы используете в настоящее время, для их включения.После того, как все это сделано, вы должны хорошо идти без проблем.

...