我已经坚持了下面这个问题很长一段时间了。在Python中,我希望用户根据使用srp身份验证的AWS cognito-identity-pool中的用户名和密码来检索令牌。有了这个令牌,我希望用户将数据上传到s3。
这是我使用的代码的一部分(来自权证库):https://github.com/capless/warrant
self.client = boto3.client('cognito-idp', region_name="us-east-1")
response = boto_client.initiate_auth(
AuthFlow='USER_SRP_AUTH',
AuthParameters=auth_params,
ClientId=self.client_id
)
def get_auth_params(self):
auth_params = {'USERNAME': self.username,
'SRP_A': long_to_hex(self.large_a_value)}
if self.client_secret is not None:
auth_params.update({
"SECRET_HASH":
self.get_secret_hash(self.username,self.client_id, self.client_secret)})
return auth_params
然而,我继续得到:
botocore\auth.py", line 352, in add_auth raise NoCredentialsError
botocore.exceptions.NoCredentialsError: Unable to locate credentials
我能够通过在.aws / credentials文件中添加凭据来消除此错误。但这不符合该计划的目的。看起来在权证或botocore库中存在错误,并且它继续尝试使用凭证文件中的AWS Access Key ID和AWS Secret Access Key,而不是使用给定的凭据(用户名和密码)。
感谢任何帮助
答案 0 :(得分:3)
我和Cognito团队在一起。 startup auth是一个未经身份验证的调用,因此它不应要求您提供AWS凭据。服务端点不会验证这些调用的sigv4签名。
话虽如此,一些客户端库在某些意义上具有某些特性,您需要提供一些虚拟凭证,否则客户端库将抛出异常。但是,您可以为凭据提供任何内容。
答案 1 :(得分:0)
AWS Access Key ID和AWS Secret Access Key与用户名和密码完全不同。
Boto3客户端必须连接到AWS服务端点(在您的情况下:cognito-idp
)才能执行任何API。在执行API之前,必须提供API凭证(密钥+密钥)来验证您的AWS账户。如果不验证您的帐户,则无法拨打SharedPreferences
API。
有一个AWS账户(密钥/密钥),但可以有多个用户(用户名/密码)。
答案 2 :(得分:0)
我也使用手令碰到了这个问题。
问题是boto3库正在尝试将请求签名到aws,但不应将此请求签名。为防止这种情况,请使用不指定签名的配置创建身份池客户端。
A.T @ B @ A