如何从AWS Cognito用户池获取用于Facebook API的联邦访问令牌?
获取Facebook原始访问令牌以调用Facebook API
你遇到的问题很常见——Cognito默认返回的是自身的访问令牌,但其实它已经帮你保留了Facebook的原始令牌,只需要正确的方式提取即可。下面是具体的操作步骤:
1. 确认Cognito身份提供商配置
首先要确保你的Facebook身份提供商设置正确,允许Cognito获取并存储Facebook的访问令牌:
- 登录AWS控制台,进入目标Cognito用户池
- 转到身份提供商页面,选择已配置的Facebook
- 检查OAuth 2.0 范围是否包含你需要调用Facebook API的权限(比如
user_posts、pages_show_list等,根据实际需求添加) - 确认已正确配置Facebook的App ID和App Secret,Cognito会自动处理令牌的获取与存储
2. 通过Cognito ID令牌提取Facebook令牌
用户成功登录后,Cognito返回的ID令牌(id_token)的Payload中包含了identities字段,这是一个存储第三方身份提供商信息的数组,里面就有Facebook的访问令牌:
- 解码ID令牌(可以用JWT解码工具,或者在代码中用
jsonwebtoken这类库处理) - 在Payload的
identities数组中,找到providerName为Facebook的条目 - 该条目里的
accessToken字段就是你需要的Facebook原始访问令牌
举个JavaScript代码示例:
import jwt from 'jsonwebtoken'; // 假设已获取到用户的Cognito ID令牌 const idToken = '用户的Cognito ID令牌'; const decodedToken = jwt.decode(idToken); // 提取Facebook访问令牌 const facebookIdentity = decodedToken.identities.find( item => item.providerName === 'Facebook' ); const facebookAccessToken = facebookIdentity?.accessToken; // 用该令牌调用Facebook API fetch('https://graph.facebook.com/v18.0/me', { headers: { 'Authorization': `Bearer ${facebookAccessToken}` } })
3. 通过Cognito API获取令牌(备选方案)
如果你不想解码ID令牌,也可以调用Cognito的GetUser API(或对应SDK方法)来获取:
- 使用用户的Cognito访问令牌调用
GetUser接口 - 在返回的
UserAttributes中,找到名为identities的属性(值为JSON字符串) - 解析该JSON字符串,找到Facebook对应的条目并提取
accessToken
示例代码(AWS SDK v3,JavaScript):
import { CognitoIdentityProviderClient, GetUserCommand } from "@aws-sdk/client-cognito-identity-provider"; const client = new CognitoIdentityProviderClient({ region: '你的AWS区域' }); const command = new GetUserCommand({ AccessToken: '用户的Cognito访问令牌' }); const response = await client.send(command); const identitiesAttr = response.UserAttributes.find(attr => attr.Name === 'identities'); const identities = JSON.parse(identitiesAttr.Value); const facebookAccessToken = identities.find( item => item.providerName === 'Facebook' ).accessToken;
注意事项
- Facebook访问令牌有过期时间,你可以通过Facebook的API刷新它,或者引导用户重新登录获取新令牌
- 确保请求的Facebook权限范围与你要调用的API匹配,否则会触发权限错误
内容的提问来源于stack exchange,提问作者moltar
相关产品推荐
相关产品推荐

