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

如何无需预配置凭证文件,通过Boto3使用AWS SSO登录访问S3?

纯Boto3实现AWS SSO登录S3并获取account_id

核心方案

直接调用AWS SSO的API完成全流程授权,无需依赖AWS CLI或预配置凭证文件,同时可以从账户角色查询步骤中直接提取用户对应的account_id。

完整代码实现

import boto3

def get_s3_client_via_sso(start_url, sso_region):
    # 1. 初始化SSO OIDC客户端
    sso_oidc = boto3.client('sso-oidc', region_name=sso_region)
    
    # 2. 注册临时客户端(每次启动应用都需执行)
    client_reg = sso_oidc.register_client(
        clientName='MyS3AccessApp',
        clientType='public'
    )
    client_id = client_reg['clientId']
    client_secret = client_reg['clientSecret']
    
    # 3. 生成授权URL,引导用户登录授权
    auth_resp = sso_oidc.start_device_authorization(
        clientId=client_id,
        clientSecret=client_secret,
        startUrl=start_url
    )
    print(f"请打开链接完成登录授权:{auth_resp['verificationUriComplete']}")
    print("登录后按回车继续...")
    input()
    
    # 4. 获取访问令牌
    token_resp = sso_oidc.create_token(
        clientId=client_id,
        clientSecret=client_secret,
        deviceCode=auth_resp['deviceCode'],
        grantType='urn:ietf:params:oauth:grant-type:device_code'
    )
    access_token = token_resp['accessToken']
    
    # 5. 查询用户有权限的账户列表(这里拿到account_id)
    sso = boto3.client('sso', region_name=sso_region)
    accounts_resp = sso.list_accounts(accessToken=access_token)
    
    # 可改为交互让用户选择账户,这里默认取第一个授权账户
    target_account = accounts_resp['accountList'][0]
    account_id = target_account['accountId']
    print(f"已选中账户:{target_account['accountName']} ({account_id})")
    
    # 6. 查询该账户下的可用角色
    roles_resp = sso.list_account_roles(
        accessToken=access_token,
        accountId=account_id
    )
    # 同样可改为用户选择角色,这里默认取第一个
    target_role = roles_resp['roleList'][0]
    role_name = target_role['roleName']
    
    # 7. 获取临时凭证
    cred_resp = sso.get_role_credentials(
        accessToken=access_token,
        accountId=account_id,
        roleName=role_name
    )
    temp_creds = cred_resp['roleCredentials']
    
    # 8. 用临时凭证初始化S3客户端
    s3_client = boto3.client(
        's3',
        aws_access_key_id=temp_creds['accessKeyId'],
        aws_secret_access_key=temp_creds['secretAccessKey'],
        aws_session_token=temp_creds['sessionToken']
    )
    
    return s3_client, account_id

# 使用示例
if __name__ == "__main__":
    # 替换为用户自己的AWS SSO启动URL和区域
    SSO_START_URL = "https://d-xxxxxx.awsapps.com/start"
    SSO_REGION = "us-east-1"
    
    s3_client, account_id = get_s3_client_via_sso(SSO_START_URL, SSO_REGION)
    
    # 测试S3客户端
    print(f"成功获取账户 {account_id} 的S3权限,列出前5个存储桶:")
    for bucket in s3_client.list_buckets()['Buckets'][:5]:
        print(f"- {bucket['Name']}")

关键说明

  • account_id的获取:调用sso.list_accounts()后,返回的accountList数组中每个元素都包含accountId字段,这就是用户有权限访问的AWS账户ID。如果用户有多个授权账户,可添加交互逻辑让用户选择目标账户。
  • 无预配置要求:整个流程不需要本地存储任何AWS凭证文件,仅需用户提供自己的SSO启动URL和区域,完成登录授权后即可生成临时凭证。
  • 凭证有效期:AWS SSO临时凭证默认有效期为1小时,到期后需重新执行授权流程。

内容的提问来源于stack exchange,提问作者Tomas Berger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:13:33