Как получить аутентифицированный ответ от AWS Cognito с помощью boto3 - PullRequest
0 голосов
/ 24 апреля 2019

Я хотел бы использовать boto3 для получения временных учетных данных для доступа к сервисам AWS.Вариант использования следующий: пользователь из моего пула пользователей Cognito входит в систему на моем сервере, и я хочу, чтобы код сервера предоставил этому пользователю временные учетные данные для доступа к другим службам AWS.

У меня есть пул пользователей Cognito, гдемои пользователи хранятся.У меня есть Cognito Identity Pool, который НЕ разрешает несанкционированный доступ, доступ только пользователям из Cognito User Pool.

Итак, вот код, с которого я начинаю:

import boto3
client = boto3.client('cognito-identity','us-west-2')
resp = client.get_id(AccountId='<ACCNTID>',
                     IdentityPoolId='<IDPOOLID>')

Однако,простое выполнение этих трех строк кода вызывает исключение:

botocore.errorfactory.NotAuthorizedException: An error 
occurred (NotAuthorizedException) when calling 
the GetId operation: Unauthenticated access is not 
supported for this identity pool.

Поскольку мой Cognito Identity Pool не настроен для доступа без аутентификации, кажется, что я не могу вызвать get_id, пока я где-то не аутентифицируюсь.

Как мне решить это?Что именно мне нужно сделать для аутентификации, чтобы я мог вызвать get_id?

UPDATE: похоже, мне нужно передать поле Logins и данные в вызов функции get_id, но для этого мне нужен токен JWT для входа в систему.,Если я запускаю это в веб-приложении (например, в бэкенде Django), где я использую предварительно настроенные экраны входа в AWS Cognito, то да, я могу получить это с URL-адреса домашней страницы после перенаправления с успешного входа в систему.Но сейчас я пишу несколько тестовых сценариев, которые не имеют ничего общего с веб-сайтом.Есть ли способ использовать boto или boto3 или какой-либо другой пакет python для входа в систему с именем пользователя и паролем и получения токена JWT?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Просто чтобы добавить ответ от Арки Мукерджи выше, чтобы получить токен, я делаю это:

auth_data = { 'USERNAME':username , 'PASSWORD':password }
provider_client=boto3.client('cognito-idp', region_name=region)
resp = provider_client.admin_initiate_auth(UserPoolId=user_pool_id, AuthFlow='ADMIN_NO_SRP_AUTH', AuthParameters=auth_data, ClientId=client_id)
token = resp['AuthenticationResult']['IdToken']

Здесь я должен использовать имя пользователя и пароль пользователя Cognito, client_id - это идентификатор клиента приложения для клиента приложения, который я настроил через Cognito, а user_pool_id - это идентификатор пула пользователей.

Обратите внимание, что в моем клиенте приложения отмечена / выбрана эта опция: включить API входа для аутентификации на основе сервера (ADMIN_NO_SRP_AUTH), и я создал этот клиент приложения без секретного ключа (очевидно, это важно для веб-клиентов).

0 голосов
/ 24 апреля 2019

Чтобы передать JWT-токен Cognito User Pool, вам нужно будет использовать Logins Map в вызове API GetId. Вы можете попробовать следующий код Python с вашей стороны, после замены необходимых заполнителей.

response = client.get_id(
    AccountId='string',
    IdentityPoolId='string',
    Logins={
        'cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>': '<JWT ID Token>'
    }
)

Если вы не предоставите Карту входа, Amazon Cognito обрабатывает событие аутентификации как Неаутентифицированное, и, следовательно, вы сталкиваетесь с этой ошибкой.

...