如何从AWS Cognito获取已连接OIDC提供商的access_token/refresh_token
获取AWS Cognito第三方OIDC提供商的Access Token/Refresh Token
要拿到Facebook这类OIDC提供商返回的token,核心是让Cognito保存并暴露这些token,下面是具体操作步骤:
一、先配置Cognito用户池,让它保存第三方Token
- 登录AWS控制台,打开你的Cognito用户池
- 进入「身份提供商」标签,选中你已配置的OIDC提供商(比如Facebook)
- 在「属性映射」区域:
- 先在用户池的「属性」标签创建一个自定义属性(比如
custom:provider_access_token) - 回到身份提供商配置,添加映射规则:把OIDC提供商返回的
access_token字段,映射到你刚创建的自定义属性 - 如果需要refresh_token,同理映射
refresh_token字段(注意部分提供商需要额外开启offline_access权限才会返回refresh_token)
- 先在用户池的「属性」标签创建一个自定义属性(比如
- 确认应用客户端设置:在用户池的「应用客户端」标签,选中你的应用,确保OAuth 2.0范围包含
openid以及提供商要求的额外范围(比如Facebook的public_profile)
二、后端获取第三方Token的两种方式
方式1:通过Cognito用户属性直接读取
当用户完成第三方登录后,Cognito会自动把提供商的token存入你配置的自定义属性里,后端可以调用Cognito的AdminGetUser接口获取:
- 示例Python代码:
import boto3 cognito_client = boto3.client('cognito-idp') def get_provider_access_token(user_pool_id, username): response = cognito_client.admin_get_user( UserPoolId=user_pool_id, Username=username ) for attr in response['UserAttributes']: if attr['Name'] == 'custom:provider_access_token': return attr['Value'] return None
- 注意:调用这个接口需要IAM用户拥有
cognito-idp:AdminGetUser权限
方式2:通过联合身份池获取(如果你用了Cognito Identity Pool)
如果你的架构用到了联合身份池,可以通过以下步骤获取:
- 用户登录后,前端拿到Cognito用户池的ID Token
- 后端用这个ID Token调用
GetId接口获取身份ID - 再调用
GetUserIdentityAttributes接口,返回结果中会包含第三方提供商的token信息
- 示例Python代码片段:
identity_client = boto3.client('cognito-identity') # 先获取身份ID id_response = identity_client.get_id( IdentityPoolId='你的联合身份池ID', Logins={ 'cognito-idp.区域.amazonaws.com/你的用户池ID': '用户的Cognito ID Token' } ) identity_id = id_response['IdentityId'] # 再获取身份属性,包含第三方token attr_response = identity_client.get_user_identity_attributes( IdentityId=identity_id ) # 遍历属性找到提供商的token for attr in attr_response['IdentityAttributes']: if 'provider_access_token' in attr['Name']: provider_token = attr['Value'] break
注意事项
- 部分OIDC提供商(比如Facebook)默认不返回refresh_token,需要在授权请求中添加
offline_accessscope - 第三方token有有效期,要根据提供商的规则处理刷新逻辑
- 确保后端调用Cognito接口的IAM权限配置正确
内容的提问来源于stack exchange,提问作者dschu
相关产品推荐
相关产品推荐

