我一直在研究这个主题,但找不到Javascript SDK的任何内容。我找到了PHP和C#的例子,但我仍然不确定Javascript SDK。据我所知,您设置了一个包含JS SDK的页面,将其放入deauthorize回调URL并订阅该页面上的authResponseChange事件。
这是我能说的最好的,但我没有找到任何例子或确认这种方法是否有效。如果可以提供任何精彩的例子。
我在Javascript测试控制台上对此进行了测试:http://developers.facebook.com/tools/console/但该方法使用了旧的其他API的撤销授权。我们希望使用取消授权的回拨URL从用户帐户中删除Facebook关联。
答案 0 :(得分:9)
您应该在服务器上处理它。取消授权回调作为表单POST发送到您的URL,其表单参数为signed_request,其中包含已签名的请求值。您需要使用应用程序密钥解析已签名的请求值,以获取删除应用程序的用户的用户ID。然后,您可以更新应用程序的数据库,或在用户删除应用程序时执行适当的操作。
由于需要使用您的app secret来解析/解密signed_request值,您不希望在javascript中执行此客户端。
答案 1 :(得分:1)
您必须在应用的设置中添加特定的网址,当用户取消对您的应用授权时,您会在该网址上收到POST请求。
在请求的正文中,您将拥有 signed_request 。 为了从signed_request获取有用的数据,您需要执行以下操作:
您可以使用加密来帮助解决这个问题。 https://www.npmjs.com/package/crypto
const crypto = require('crypto');
function parseRequest(signed_request, secret){
signed_request = signed_request.split('.');
var encoded_sig = signed_request[0];
var payload = signed_request[1];
var data = JSON.parse(new Buffer(payload, 'base64').toString());
if (data.algorithm.toUpperCase() !== 'HMAC-SHA256')
return null;
var hmac = crypto.createHmac('sha256', secret);
var encoded_payload = hmac.update(payload).digest('base64')
.replace(/\//g, '_').replace(/\+/g, '-').replace(/={1,2}$/, '');
if (encoded_sig !== encoded_payload)
return null;
return data;
}
答案 2 :(得分:0)
对于那些没有获得变量 signed_request 的用户,您需要使用body-parser:
const bodyParser = require('body-parser');
router.post('/YOUR_CALLBACK_URL', bodyParser.urlencoded({ extended: true }), (req, res) => {
const signed_request = req.body.signed_request;
//verify data initially, something like:
if((typeof signed_request !== 'string') || (signed_request.length < 3) || (!signed_request.includes('.'))) {
return res.status(400).end();
}
//after that, use @Maysara answer to parse data:
const data = parseRequest(signed_request, YOUR_FACEBOOK_CLIENT_SECRET);
if(!data){
return res.status(400).end();
}
//use data
});
不要忘记: npm install --save body-parser
答案 3 :(得分:-1)
为方便搜索“Facebook javascript de-authorize”的人发现这篇文章,Facebook的JavaScript SDK v2.1允许您取消对应用的授权。
见https://developers.facebook.com/docs/graph-api/reference/v2.1/user/permissions#delete
特别是JavaScript SDK选项卡:
/* make the API call */
FB.api(
"/me/friends",
function (response) {
if (response && !response.error) {
/* handle the result */
}
}
);