Использование aws STS для получения временных учетных данных: где находится токен веб-идентификации? - PullRequest
0 голосов
/ 17 февраля 2020

Мои пользователи входят в мое приложение через микросервис, который подключается к cognito (запрос передается через шлюз API)

Они получают токен сеанса.

После входа в систему им необходимо положить некоторые файлы на S3.

Я хочу дать им временные учетные данные с помощью STS, но для вызова sts.AssumeRoleWithWebIdentity мне нужен токен веб-идентификации.

Как получить токен веб-идентификации с маркер сеанса в качестве входных данных?

Я написал временную лямбду (узел), которая возвращает учетные данные STS при входе в систему с именем пользователя и паролем:

const cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider();
const cognitoidentity = new AWS.CognitoIdentity();
cognitoidentityserviceprovider.initiateAuth(...) //AuthFlow: 'USER_PASSWORD_AUTH'
    cognitoidentity.getId(...)
        cognitoidentity.getCredentialsForIdentity(...)

Может пройти некоторое время между входом в систему и загрузка файла, и я не хочу, чтобы пользователь каждый раз вводил имя пользователя / пароль. AuthFlow также не принимает токен сеанса.

Я предполагаю, что шлюз API мог вернуть что-то полезное, но я не нашел ничего в документации: https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#context -variable-reference

1 Ответ

1 голос
/ 18 февраля 2020

Сначала несколько проверок:

  • позволяет аутентифицированному пользователю cognito "маскироваться" под ролью iam, для этого мы используем доверительные отношения , для быстрого вы можете повторно использовать Роль iam, назначенная вашему пулу идентификации cognito.
  • предоставьте этой роли iam политику для доступа к корзине s3

После выполнения:

Запустите cognitoidentity.getCredentialsForIdentity(...) снова, сначала он будет go через sts, поэтому вам не нужно вызывать sts для принятия роли api. В случае успеха ответ должен содержать AccessKeyId, SecretKey и SessionToken. Это срок действия aws кредитов, которые имеют доступ к s3 и исчезнут через час (если не установлено). Используйте их как обычную сеансовую аутентификацию.

creds = new SessionAWSCredentials(AccessKeyId, SecretKey, SessionToken);
s3Request = CreateAmazonS3Client(creds);
...