如何在jQuery中传递appsecret_proof?Facebook登录相关疑问
问题
我已经实现了Facebook登录功能,但Facebook出于安全要求强制我开启require app secret,否则会限制应用导致无法登录。开启后登录时出现如下报错:
{ "error": { "message": "API calls from the server require an appsecret_proof argument", "type": "GraphMethodException", "code": 100, "fbtrace_id": "APM.........." } }
我调用的权限申请API代码如下:
FB.api('/me?fields=name,email,first_name,last_name,gender', function(response) { // 处理逻辑 });
请问:
- 如何在jQuery中传递
appsecret_proof参数? - 若仅使用登录功能,是否需要开启
require app secret?
解答
1. 关于传递appsecret_proof参数
首先明确:appsecret_proof必须在服务器端生成和传递,绝对不能在前端(jQuery/浏览器环境)处理,因为App Secret是应用的敏感密钥,暴露在前端会导致应用被恶意攻击。
正确流程是:
- 前端完成Facebook登录后,拿到用户的
access_token - 把
access_token发送到你的后端服务器 - 后端用
access_token和你的App Secret生成appsecret_proof——生成规则是对access_token做HMAC-SHA256哈希,密钥为App Secret - 后端带着
appsecret_proof参数调用Facebook Graph API,处理完后把结果返回给前端
如果非要在前端硬传(极度不推荐),可以在请求URL里拼接参数,但这会直接泄露App Secret,绝对禁止这么做:
// 绝对不要在前端写App Secret!!! const appSecret = '你的应用密钥'; // 这会导致密钥泄露 const accessToken = '用户登录获取的access_token'; // 前端生成proof(不安全) const proof = CryptoJS.HmacSHA256(accessToken, appSecret).toString(CryptoJS.enc.Hex); // 调用API时拼接参数 FB.api(`/me?fields=name,email,first_name,last_name,gender&appsecret_proof=${proof}`, function(response) { // 处理逻辑 });
2. 仅登录功能是否需要开启require app secret?
如果只是做基础的Facebook登录(获取用户基本信息、拿到access_token),理论上可以关闭require app secret,此时前端直接调用Graph API不需要appsecret_proof。但Facebook现在对新应用的安全管控越来越严,可能会强制要求开启。
但从安全角度建议:如果你的登录流程需要在服务器端验证access_token的有效性,或者涉及用户敏感信息的获取,一定要开启require app secret,并在服务器端处理所有Graph API调用,这样能避免access_token被滥用的风险。
内容的提问来源于stack exchange,提问作者Rahul Gupta
相关产品推荐
相关产品推荐

