Как отключить подписание запроса и, следовательно, требование, чтобы у вас были действительные AWS локальные настройки учетных данных API?
Я пытаюсь написать сценарий, который анонимный пользователь может использовать для аутентификации в AWS Cognito User Pool, и чтобы упростить процесс, я не хочу требовать, чтобы они сначала настроили свою собственную учетную запись AWS и получили учетные данные API. Я просто хочу, чтобы они представили свое имя пользователя и пароль и получили маркер аутентификации.
Код Python, чтобы сделать это, довольно прост:
import boto3
provider_client = boto3.client('cognito-idp', region_name='us-east-1')
resp = provider_client.initiate_auth(AuthFlow='USER_PASSWORD_AUTH', AuthParameters={ 'USERNAME':'<myusername>' , 'PASSWORD':'<mypassword>' }, ClientId='<myclientid>')
Однако по умолчанию boto3 требует от вас AWS настройки учетных данных, и если вы этого не сделаете, этот код завершится с ошибкой:
botocore.exceptions.NoCredentialsError: Unable to locate credentials
Это не имеет смысла для меня. Вам не нужны AWS учетные данные только для аутентификации имени пользователя.
И, конечно же, после изучения трассировки, если я go введу код в botocore/signers.py", line 160, in sign
Я вижу:
if signature_version != botocore.UNSIGNED:
kwargs = {
'signing_name': signing_name,
'region_name': region_name,
'signature_version': signature_version
}
if expires_in is not None:
kwargs['expires'] = expires_in
if not explicit_region_name and request.context.get(
'signing', {}).get('region'):
kwargs['region_name'] = request.context['signing']['region']
try:
auth = self.get_auth_instance(**kwargs)
except UnknownSignatureVersionError as e:
if signing_type != 'standard':
raise UnsupportedSignatureVersionError(
signature_version=signature_version)
else:
raise e
auth.add_auth(request)
Итак, предположительно, есть некоторые настройки, которые поддерживают выдачу неподписанных запросов. Если я вручную закомментирую это выражение if, имитирующее случай, когда signature_version = botocore.UNSIGNED
, тогда мой код работает отлично, и мне выдан токен аутентификации. Но, очевидно, я не хочу взламывать кодовую базу boto3 только для аутентификации.
У меня проблемы с отслеживанием всех вызовов функций, и я не уверен, как настроить boto3 так, чтобы он использовал signature_version = botocore.UNSIGNED
. Как заставить его использовать неподписанные запросы для этого специфического c вызова?