Как отключить подписание запроса в boto3 API или cognito аутентификацию? - PullRequest
0 голосов
/ 18 апреля 2020

Как отключить подписание запроса и, следовательно, требование, чтобы у вас были действительные 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 вызова?

1 Ответ

0 голосов
/ 18 апреля 2020

Вы можете сделать следующее с помощью boto3:

import boto3
from botocore import UNSIGNED
from botocore.config import Config
s3 = boto3.client('s3', config=Config(signature_version=UNSIGNED))

Эквивалентом с awscli является добавление --no-sign-request.

...