如何无需预配置凭证文件,通过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
相关产品推荐
相关产品推荐

