Я пытаюсь написать тест API в Python для моего веб-сервиса. Я хотел бы избежать использования пароля тестового пользователя из моего пула AWS Cognito. Моя стратегия для этого, и дайте мне знать, если есть лучший способ здесь, состоит в том, чтобы требовать запуска теста API с привилегиями администратора Cognito. Затем используйте библиотеку boto3, чтобы получить JWT AccessToken для пользователя, который я буду добавлять в заголовок каждого запроса на тест API.

Документация не дает мне способа получить AccessToken. Я пытаюсь использовать это здесь: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cognito-idp.html#CognitoIdentityProvider.Client.admin_initiate_auth

Admin_initiate_auth нужен один из трех режимов авторизации. USER_PASSWORD_AUTH требует пароль, USER_SRP_AUTH требует секрет клиента, CUSTOM_AUTH требует секретный хеш. Я надеюсь найти способ написания этого сценария, чтобы мне просто были нужны правильные привилегии IAM, а не проверять общедоступный тестовый пароль пользователя.

Или ... я думаю ... быть сказанным, что это не лучший способ сделать это, и что другой способ более уместен. Конечной целью является тестирование черного ящика API для службы, защищенной Cognito.

7
mmachenry 17 Авг 2019 в 19:37

2 ответа

Лучший ответ

Если тест API должен быть защищен с помощью Cognito, вам всегда понадобится какой-нибудь пароль. Лучший способ избежать его хранения - создать временного пользователя перед запуском набора тестов, а затем удалить его после завершения.

Вы можете использовать AdminCreateUser для выполнения этот. Сгенерируйте новый пароль во время выполнения и передайте его как временный пароль для пользователя вместе с SUPRESS, указанным для MessageAction. Временный пароль подходит для одного входа в систему, и это все, что вам нужно в этом случае использования. Затем вы можете запустить AdminInitiateAuth в режиме аутентификации ADMIN_NO_SRP_AUTH, указав сгенерированный пароль. Очистка с помощью AdminDeleteUser после испытаний Закончив.

2
xlem 17 Авг 2019 в 17:23

Для моего собственного проекта я также подумывал о похожей стратегии для тестирования Cognito-защищенных API.

Я думаю, что создание временного пользователя со случайным паролем для каждого запуска теста - это справедливый подход.

Я думаю, что для создания пользователя из командной строки существуют более простые вызовы API Cognito: зарегистрироваться и администратор-подтверждение-регистрация, предоставленный в cognito-idp CLI. Благодаря этому вы можете пропустить шаги для решения проблем, и пользователь готов к использованию.

Если вы хотите использовать boto3, вот простая функция для создания нового пользователя:

def create_user(username: str, password: str, 
                user_pool_id: str, app_client_id: str) -> None:
    client = boto3.client('cognito-idp')

    # initial sign up
    resp = client.sign_up(
        ClientId=app_client_id,
        Username=username,
        Password=password,
        UserAttributes=[
            {
                'Name': 'email',
                'Value': 'test@test.com'
            },
        ]
    )

    # then confirm signup
    resp = client.admin_confirm_sign_up(
        UserPoolId=user_pool_id,
        Username=username
    )

    print("User successfully created.")

Затем, чтобы получить JWT,

def authenticate_and_get_token(username: str, password: str, 
                               user_pool_id: str, app_client_id: str) -> None:
    client = boto3.client('cognito-idp')

    resp = client.admin_initiate_auth(
        UserPoolId=user_pool_id,
        ClientId=app_client_id,
        AuthFlow='ADMIN_NO_SRP_AUTH',
        AuthParameters={
            "USERNAME": username,
            "PASSWORD": password
        }
    )

    print("Log in success")
    print("Access token:", resp['AuthenticationResult']['AccessToken'])
    print("ID token:", resp['AuthenticationResult']['IdToken'])
3
Tomoyuki Mano 12 Ноя 2019 в 14:26