Я пытаюсь написать тест 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.
2 ответа
Если тест API должен быть защищен с помощью Cognito, вам всегда понадобится какой-нибудь пароль. Лучший способ избежать его хранения - создать временного пользователя перед запуском набора тестов, а затем удалить его после завершения.
Вы можете использовать AdminCreateUser для выполнения этот. Сгенерируйте новый пароль во время выполнения и передайте его как временный пароль для пользователя вместе с SUPRESS
, указанным для MessageAction
. Временный пароль подходит для одного входа в систему, и это все, что вам нужно в этом случае использования. Затем вы можете запустить AdminInitiateAuth
в режиме аутентификации ADMIN_NO_SRP_AUTH
, указав сгенерированный пароль. Очистка с помощью AdminDeleteUser после испытаний Закончив.
Для моего собственного проекта я также подумывал о похожей стратегии для тестирования 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'])
Похожие вопросы
Новые вопросы
amazon-web-services
Amazon Web Services (AWS) — это облачный сервис, предлагающий решения IaaS (инфраструктура как услуга) и SaaS (программное обеспечение как услуга). Только вопросы по программированию применительно к AWS относятся к теме. Общую справку по серверу можно получить по адресу https://serverfault.com. Тег AWS редко используется сам по себе и обычно используется с другими тегами, чтобы более четко определить тему вопроса.