如何使用 boto3 从 AWS Cognito 获取经过身份验证的身份响应

Mar*_*arc 9 python amazon-cognito boto3

我想使用 boto3 来获取访问 AWS 服务的临时凭证。用例是这样的:我的 Cognito 用户池中的一个用户登录到我的服务器,我希望服务器代码为该用户提供访问其他 AWS 服务的临时凭证。

我有一个 Cognito 用户池,用于存储我的用户。我有一个不允许未经授权的访问的 Cognito 身份池,只有来自 Cognito 用户池的用户才能访问。

所以这是我开始的代码:

import boto3
client = boto3.client('cognito-identity','us-west-2')
resp = client.get_id(AccountId='<ACCNTID>',
                     IdentityPoolId='<IDPOOLID>')
Run Code Online (Sandbox Code Playgroud)

但是,仅仅运行这三行代码就会抛出异常:

botocore.errorfactory.NotAuthorizedException: An error 
occurred (NotAuthorizedException) when calling 
the GetId operation: Unauthenticated access is not 
supported for this identity pool.
Run Code Online (Sandbox Code Playgroud)

由于我的 Cognito 身份池未设置为未经身份验证的访问,因此在我以某种方式在某处进行身份验证之前,我似乎无法调用 get_id。

我该如何解决这个问题?我到底需要做什么才能进行身份验证才能调用 get_id?

更新:看起来我需要将 Logins 字段和数据传递给 get_id 函数调用,但为此我需要登录 JWT 令牌。如果我在使用 AWS Cognito 预打包登录屏幕的 web 应用程序(例如 Django 后端)中运行它,那么是的,我可以在成功登录重定向后从主页 URL 获取此信息。但是现在我正在编写一些与网站无关的测试脚本。有没有办法使用 boto 或 boto3 或其他一些 python 包来使用用户名和密码登录并获取 JWT 令牌?

Ark*_*jee 7

要传递 Cognito 用户池 JWT 令牌,您需要Logins MapGetIdAPI 调用中使用 。替换必要的占位符后,您可以尝试使用以下 Python 代码。

response = client.get_id(
    AccountId='string',
    IdentityPoolId='string',
    Logins={
        'cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>': '<JWT ID Token>'
    }
)
Run Code Online (Sandbox Code Playgroud)

如果您不提供登录映射,Amazon Cognito 会将身份验证事件视为未经身份验证,因此您会遇到此错误。


Mar*_*arc 6

只是为了添加上面来自 Arka Mukherjee 的答案,为了获得令牌,我这样做:

auth_data = { 'USERNAME':username , 'PASSWORD':password }
provider_client=boto3.client('cognito-idp', region_name=region)
resp = provider_client.admin_initiate_auth(UserPoolId=user_pool_id, AuthFlow='ADMIN_NO_SRP_AUTH', AuthParameters=auth_data, ClientId=client_id)
token = resp['AuthenticationResult']['IdToken']
Run Code Online (Sandbox Code Playgroud)

这里我必须使用 Cognito 用户的用户名和密码,client_id 是我通过 Cognito 设置的应用程序客户端的应用程序客户端 ID,而 user_pool_id 是用户池 ID。

请注意,我的应用程序客户端已选中/选中此选项:启用登录 API 以进行基于服务器的身份验证 (ADMIN_NO_SRP_AUTH) 并且我创建了该应用程序客户端,但没有使用密钥(显然这对于​​ Web 客户端尤其重要)。