提问者:小点点

如何禁用请求签名boto3API或认知认证?


如何禁用请求签名,从而禁用本地设置有效AWSAPI凭据的要求?

我正在尝试编写一个匿名用户可以用来向AWSCognito用户池进行身份验证的脚本,为了简化过程,我不想要求他们首先设置自己的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凭据来验证用户登录。

果然,在研究了回溯之后,如果我进入botocore/signers.py"的代码,第160行,在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)

因此,大概有一些设置支持发出未签名的请求。如果我模拟signature_version=botocore. UNSIGNED的情况手动注释掉这个if语句,那么我的代码运行良好,并且我获得了身份验证令牌。但显然我不想为了身份验证而破解boto3代码库。

我无法跟踪所有函数调用,并且我不确定如何配置boto3以使其使用signature_version=botocore. UNSIGNED。如何强制它为此特定调用使用未签名的请求?


共1个答案

匿名用户

您可以使用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