这是我的第一篇文章,所以请不要对我太苛刻!
我是一个使用javascript和node.js的初级开发人员。我正在尝试从一个node js文件向facebook的图形API发出一个基本请求。我已经使用我的facebook帐户注册了他们的开发人员服务,并且我已经安装了在这里找到的FB的节点包(https://www.npmjs.com/package/fb)。这看起来很正式。
一切似乎都正常,除了我收到GET请求的响应消息说我的appsecret_proof无效。
这是我正在使用的代码(请注意,敏感信息只是键盘混搭)。
let https = require("https");
var FB = require('fb');
FB.options({
version: 'v2.11',
appId: 484592542348233,
appSecret: '389fa3ha3fukzf83a3r8a3f3aa3a3'
});
FB.setAccessToken('f8af89a3f98a3f89a3f87af8afnafmdasfasedfaskjefzev8zv9z390fz39fznabacbkcbalanaa3fla398fa3lfa3flka3flina3fk3anflka3fnalifn3laifnka3fnaelfafi3eifafnaifla3nfia3nfa3ifla');
console.log(FB.options());
FB.api('/me',
'GET',
{
"fields": "id,name"
},
function (res) {
if(!res || res.error) {
console.log(!res ? 'error occurred' : res.error);
return;
}
console.log(res);
console.log(res.id);
console.log(res.name);
}
);
我得到的错误是:
{ message: 'Invalid appsecret_proof provided in the API argument',
type: 'GraphMethodException',
code: 100,
fbtrace_id: 'H3pDC0OPZdK' }
我已经在开发人员页面上重置了我的appSecret和accessToken,并在重置后立即尝试了它们。我得到了同样的错误,所以我不认为过时的凭证是问题所在。我的
console.log(FB.options())
返回一个适当的外观对象,该对象也如预期的那样包含appSecretProof的长哈希。我还在选项中使用了许多版本号(v2.4、v2.5、v2.11,并且没有任何版本密钥)来尝试此代码。Facebook在这方面的文档让我感到有些不清楚。我认为我应该使用SDK的v2.5 ( node包旨在模仿它),并向图形API的v2.11发出请求,但是?无论如何,这似乎不能解释我所遇到的问题。当我根本没有指定任何版本号时,我会得到一个非常好的响应,告诉我我的appSecretProof是无效的。
fb的节点包应该会为我生成这个appSecretProof,看起来它就是这样做的。根据软件包文档,我的其他信息和语法似乎都是正确的。这里我漏掉了什么?提前感谢你们所有人。
发布于 2018-01-22 13:14:15
看起来你需要在你的应用程序的高级设置中进行双因素授权的appsecret_proof。
访问令牌是可移植的。可以获取由Facebook的SDK在客户端生成的访问令牌,将其发送到服务器,然后代表客户端从该服务器进行调用。访问令牌也可能被个人计算机上的恶意软件或中间人攻击窃取。然后,可以从一个完全不同的系统使用该访问令牌,该系统既不是客户端,也不是您的服务器,从而生成垃圾邮件或窃取数据。
您可以通过将appsecret_proof参数添加到来自服务器的每个应用程序接口调用,并启用该设置以要求所有调用都提供证明,从而防止出现这种情况。这可以防止坏人从他们的服务器使用您的访问令牌进行API调用。如果您使用的是官方PHP SDK,则会自动添加appsecret_proof参数。
请参考下面的url生成有效的appsecret_proof,并将其添加到每个接口调用中
https://developers.facebook.com/docs/graph-api/securing-requests
发布于 2020-05-24 02:32:21
在使用passport-facebook-token
时,我不得不处理同样的问题,我最终发现这个问题与我的代码库逻辑或应用程序配置无关。
我之所以出现这个错误,是因为我故意向请求中添加了一个authorization头。因此,如果您使用postman或其他http客户端,只需确保请求不包含任何authorization报头。
https://stackoverflow.com/questions/48366926
复制相似问题