【问题标题】:AWS Boto / Warrant library: SRP authentication and credentials errorAWS Boto / Warrant 库:SRP 身份验证和凭证错误
【发布时间】:2018-05-30 16:31:28
【问题描述】:

我已经被以下问题困扰了很长一段时间了。在 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 访问密钥 ID 和 AWS 秘密访问密钥,而不是使用给定的凭证(用户名和密码)。

感谢任何帮助

【问题讨论】:

    标签: python amazon-web-services boto3 amazon-cognito


    【解决方案1】:

    我加入了 Cognito 团队。 Initial auth 是一个未经身份验证的调用,因此它不应该要求您提供 AWS 凭证。服务端点不会验证这些调用的 sigv4 签名。

    话虽如此,某些客户端库具有某些特殊性,即您需要提供一些虚拟凭据,否则客户端库将引发异常。但是,您可以为凭据提供任何内容。

    【讨论】:

    • 是的!而已。非常感谢。对于遇到类似问题的任何人,我使用了以下虚拟的 aws_access_key_id=AKIAIOSFODNN7EXAMPLE aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    • 我在使用 REFRESH_TOKEN_AUTH 序列时遇到了同样的问题。提供 aws_access_key_id 和 aws_secret_access_key(即使它们应该已经过期)也解决了这个问题
    【解决方案2】:

    我也遇到了这个,使用授权。

    问题在于 boto3 库正在尝试对 aws 的请求进行签名,但该请求不应该被签名。为防止这种情况,请使用指定不签名的配置创建身份池客户端。

    import boto3
    from botocore import UNSIGNED
    from botocore.config import Config
    
    client = boto3.client('cognito-idp', region_name='us-east-1', config=Config(signature_version=UNSIGNED))
    

    【讨论】:

      【解决方案3】:

      AWS Access Key ID 和 AWS Secret Access Key 与用户名和密码完全不同。

      Boto3 客户端必须连接到 AWS 服务端点(在您的情况下为:cognito-idp.us-east-1.amazonaws.com)才能执行任何 API。在执行 API 之前,必须提供 API 凭证(密钥+秘密)来验证您的 AWS 账户。如果不验证您的帐户,您将无法调用cognito-idp API。

      有一个 AWS 账户(密钥/秘密),但可以有多个用户(用户名/密码)。

      【讨论】:

      • 感谢您的回答。我在 boto3 文档中阅读了以下内容:“其中 ACCESS_KEY、SECRET_KEY 和 SESSION_TOKEN 是包含您的访问密钥、秘密密钥和可选会话令牌的变量。请注意,上面的示例没有硬编码凭据。我们不建议硬编码源代码中的凭据。”此外,在我的 android 应用程序中,用户(在注册到我的用户池后)也可以进行身份​​验证(使用用户名和密码),我从不使用访问密钥 ID 和秘密访问密钥,这很好用。 android 和 boto3 之间有何不同以及为什么不同?
      • 此外,在 botocore 的 signers.py 中,您可以在 def get_auth_instance 中找到以下注释: # 如果没有提供凭据(即凭据为无),# 那么我们将传递一个值“无" 到 auth 类,# 它已经处理了没有提供凭据的情况。所以基本上,使用用户名和密码(不是来自 AWS 账户,而是来自用户池!!!)我尝试检索临时凭证。这样程序的用户就不必记住他们的访问密钥和秘密密钥,并且可以使用用户名/密码来识别自己并执行 AWS 操作。
      猜你喜欢
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 2016-02-20
      • 2019-12-17
      • 1970-01-01
      • 2019-08-05
      相关资源
      最近更新 更多