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

时间:2019-04-24 02:38:06

标签: python boto3 amazon-cognito

我想使用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>')

但是,仅运行以下三行代码会引发异常:

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

由于我的Cognito身份池未设置为未经身份验证的访问,因此看来我无法调用get_id,直到我以某种方式进行身份验证为止。

我该如何解决?我到底需要做什么才能进行身份验证,以便可以调用get_id?

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

2 个答案:

答案 0 :(得分:0)

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

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

如果您不提供登录名地图,则Amazon Cognito会将身份验证事件视为未经身份验证,因此,您将面临此错误。

答案 1 :(得分:0)

只需添加上述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']

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

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