如何禁用请求签名,从而禁用本地设置有效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
。如何强制它为此特定调用使用未签名的请求?
您可以使用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
。