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 令牌?
要传递 Cognito 用户池 JWT 令牌,您需要Logins Map在GetIdAPI 调用中使用 。替换必要的占位符后,您可以尝试使用以下 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 会将身份验证事件视为未经身份验证,因此您会遇到此错误。
只是为了添加上面来自 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 客户端尤其重要)。