当前位置: 首页 > 知识库问答 >
问题:

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

乐正乐湛
2023-03-14

我想使用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函数调用,但要做到这一点,我需要login JWT令牌。如果我在使用AWS Cognito预打包登录屏幕的webapp(如Django后端)中运行此功能,则可以在成功登录重定向后从主页URL获得此功能。但现在我正在编写一些与网站无关的测试脚本。有没有一种方法可以使用boto或boto3或其他python包使用用户名和密码登录并获取JWT令牌?

共有2个答案

薛元忠
2023-03-14

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

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

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

尉迟跃
2023-03-14

只是为了补充上面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客户端尤其重要)。

 类似资料:
  • 我正在使用一个带有开发人员身份验证身份的Authflow设置的认知身份池--选择这个auth流是因为出于一些业务原因,我们不能使用认知用户池。因此,我自己使用带有authendpoint的API网关实现了一个用户标识提供者服务,该endpoint激发一个Lambda函数。 因此,我通过运行和随后运行生成了一个临时的和,并获得了临时的AWS凭据(临时的和)。 现在,我希望生成一个,以便在我使用IAM

  • 我的代码在这里:代码重新发布是因为我想问一个更直接的问题。如何在未经身份验证的用户和经过身份验证的用户之间切换?我的未经验证的文件似乎已缓存,我使用了以下方法: 在我剩下的api代码之前,它仍然不能工作。谢谢你的帮助 注意:我知道它不起作用,因为我在切换配置/凭据提供程序后立即使用lambda进行调用,并且只有授权用户才能调用此方法。 编辑@behrooziAWS答案: API代码: 完整错误:B

  • 问题内容: 你可以在模板方面知道当前用户是否已通过身份验证: 但是我没有找到获取经过身份验证的用户列表的方法。 问题答案: 与rz的答案一起,你可以查询未到期的会话模型,然后将会话数据转换为用户。一旦知道了,就可以将其转换为模板标记,该标记可以在任何给定页面上呈现列表。 (这都是未经测试的,但希望将接近工作)。 提取所有已登录的用户… 使用此功能,你可以制作一个简单的包含模板标签… 然后,你可以在

  • 身份验证 PDF版下载 企业应用中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息。 通过此接口获取员工身份会有一定的时间开销。对于频繁获取员工身份的场景,建议采用如下方案: 企业应用中的URL链接直接填写企业自己的页面地址; 员工跳转到企业页面时,企业校验是否有代表员工身份的cookie,此cookie由企业生成; 如果没有获取到cookie,重定向到OAuth验证链接,获取员工

  • 在我配置了下面的配置之后,它不会连接到Active Directory。我无法使用Active Directory的帐户登录。会有什么问题? 我有一个Ubuntu服务器18.04,带有ApacheGuacamoleV1。0.0. 安装。我想使用LDAP身份验证来验证用户。我已经下载了鳄梨酱-auth-ldap-1.0.0。jar和jldap-4.3。jar扩展。 10.10.10.21,10.10

  • 我询问了如何建立一个服务呼叫,并在HttpClient上获得了一个很好的信息。然而,虽然这个问题在技术上得到了回答,但我还是被卡住了。 在控制台中,我可以看到我的浏览器向服务发送了什么请求来获取授权令牌。然而,当我尝试在我的服务层中模拟构建请求的调用时,我得到以下错误消息。我在这里犯错的可能性很大。不知道该用谷歌搜索什么,真的。。。 "StatusCode: 500, ReasonPhrase:'