You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于AWS Cognito用户池访问令牌获取IAM凭证并初始化boto3客户端

如何基于AWS Cognito用户池访问令牌获取IAM凭证并初始化boto3客户端

嗨,我来帮你理清楚怎么用Cognito用户池的访问令牌拿到IAM临时凭证,进而初始化boto3客户端~其实核心思路是用户池负责身份认证,身份池负责授权并发放临时IAM凭证,所以你需要把两者结合起来用,步骤如下:


前提准备

首先得确保你的Cognito用户池已经和一个Cognito身份池集成好了:

  • 登录AWS控制台,打开Cognito身份池的配置页面
  • 在“身份提供者”里添加你的用户池,配置好对应的用户池ID和应用客户端ID
  • 给身份池设置好已认证身份的IAM角色,这个角色需要拥有你后续boto3客户端要调用的AWS服务权限(比如S3读写、DynamoDB访问等)

具体步骤&代码示例

1. 用用户池访问令牌获取身份ID

首先调用Cognito Identity的GetId接口,传入身份池ID和用户的访问令牌,拿到对应的身份ID。

2. 通过身份ID获取临时IAM凭证

接着调用GetCredentialsForIdentity接口,传入身份ID和同样的访问令牌,就能拿到临时的IAM凭证(包含AccessKeyId、SecretKey、SessionToken)。

3. 用凭证初始化boto3客户端

最后用拿到的临时凭证直接初始化boto3的客户端即可。

下面是完整的Python代码示例:

import boto3

# 替换成你自己的配置参数
REGION = 'us-east-1'  # 你的AWS区域
USER_POOL_ID = 'us-east-1_xxxxxxxxx'  # 用户池ID
IDENTITY_POOL_ID = 'us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'  # 身份池ID
USER_ACCESS_TOKEN = 'eyJraWQiOiJ...'  # 用户的访问令牌

# 初始化Cognito Identity客户端
cognito_identity_client = boto3.client('cognito-identity', region_name=REGION)

# 第一步:获取身份ID
try:
    get_id_result = cognito_identity_client.get_id(
        IdentityPoolId=IDENTITY_POOL_ID,
        Logins={
            f'cognito-idp.{REGION}.amazonaws.com/{USER_POOL_ID}': USER_ACCESS_TOKEN
        }
    )
    identity_id = get_id_result['IdentityId']
except Exception as e:
    print(f"获取身份ID失败: {str(e)}")
    exit(1)

# 第二步:获取临时IAM凭证
try:
    get_creds_result = cognito_identity_client.get_credentials_for_identity(
        IdentityId=identity_id,
        Logins={
            f'cognito-idp.{REGION}.amazonaws.com/{USER_POOL_ID}': USER_ACCESS_TOKEN
        }
    )
    temp_credentials = get_creds_result['Credentials']
except Exception as e:
    print(f"获取IAM凭证失败: {str(e)}")
    exit(1)

# 第三步:初始化boto3客户端(这里以S3为例,你可以换成其他服务)
s3_client = boto3.client(
    's3',
    region_name=REGION,
    aws_access_key_id=temp_credentials['AccessKeyId'],
    aws_secret_access_key=temp_credentials['SecretKey'],
    aws_session_token=temp_credentials['SessionToken']
)

# 测试调用(需要对应IAM角色有S3列表权限)
try:
    buckets = s3_client.list_buckets()
    print("成功获取S3桶列表:")
    for bucket in buckets['Buckets']:
        print(f"- {bucket['Name']}")
except Exception as e:
    print(f"S3调用失败: {str(e)}")

关键注意事项

  • 权限配置:一定要确保身份池的已认证角色拥有你需要的AWS服务权限,否则即使拿到凭证,调用服务也会报错
  • 令牌有效性:用户池的访问令牌有过期时间(默认1小时),过期后需要重新获取
  • 参数正确性:Logins字典的键格式必须是cognito-idp.<区域>.amazonaws.com/<用户池ID>,不能写错

备注:内容来源于stack exchange,提问作者Sven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 15:44:33