如何验证Facebook注册应用的用户Access Token合法性
用Facebook Access Token认证后端API的方案
背景
我日常基于Azure Active Directory开发,注册应用后在React中使用MSAL库获取JWT Token,前端携带该Token调用后端API时,后端只需验证签名、对应应用及用户身份即可完成API保护。但在个人项目中接入Facebook身份提供商后,发现获取的Access Token并非JWT格式,不清楚如何在后端完成以下验证:
- 验证Token由Facebook签发
- 验证Token关联的是我注册的Facebook应用
- 验证Token对应的用户身份
已实现的前端代码
React登录组件:
<React.StrictMode> <FacebookLogin appId="<App ID Here>" autoLoad={false} fields="name,email,picture" callback={responseFacebook} /> <App /> </React.StrictMode>
登录回调函数:
const responseFacebook = (response) => { console.log(response); }
登录成功后控制台返回的响应数据:
{ "name": "<My Name Here>", "email": "<My Mail Here>", "picture": "<Picture Data Here>", "id": "<ID Here>", "accessToken": "EAAJlEXBfRWgBAGHTP0ZAgRttMSMZzAxWM4B6aAZBL7FlGSWgZBITj9HXb2mZAVuoyIc1V43StjYwuwcsSTZBEd4aPK6iGwbNGRvN7o5PH3ZAOymGxtb5W8k2BYYdAW5w1frXt8JeEvJI3SCoOsJqMVHm9mo5N7NpSZBKs74wqu8LvgQbqqYfvialeSP5LwtUMMS51pMsN5Kwv7aWPud0", "userID": "<User ID Here>", "expiresIn": 6488, "signedRequest": "<A Bunch of Gibberish>", "graphDomain": "facebook", "data_access_expiration_time": 1677528712 }
验证方案
Facebook的Access Token并非JWT格式,无法直接解析Claims,后端需通过Facebook官方提供的调试接口完成验证:
1. 后端发起验证请求
后端接收前端传递的accessToken后,发起GET请求到以下地址:
https://graph.facebook.com/debug_token?input_token={前端传入的accessToken}&access_token={你的应用凭证}
其中应用凭证格式为{你的Facebook应用ID}|{你的Facebook应用密钥},需从Facebook开发者后台获取。
2. 校验返回结果
接口返回的JSON数据中,需重点检查以下字段:
data.is_valid:必须为true,证明Token合法有效data.app_id:必须与你注册的Facebook应用ID完全一致,确保Token是你的应用生成data.user_id:与前端返回的userID比对,确认Token对应的用户身份- 可选校验
data.expires_at,确保Token未过期
3. 优化后续API调用
验证通过后,建议后端生成自定义的会话Token(如JWT)返回给前端,后续前端使用该自定义Token调用你的API,避免每次请求都调用Facebook的验证接口,提升系统性能。
内容的提问来源于stack exchange,提问作者J3STER
相关产品推荐
相关产品推荐

