验证 Facebook 用户的服务器端方法

3
我正在编写一个 Facebook 应用程序,列出用户的朋友,并与用户提供的有关他们的信息进行交叉引用(存储在 Google App Engine 数据库中)。我的应用程序操作如下:
用户登录 Facebook 后,通过 Facebook 的 Javascript SDK 进行 Graph API 调用以获取他们的朋友列表。同时,向我的 Google App Engine 请求处理程序发送 AJAX 请求,其中包含用户的 Facebook ID,处理程序会返回一个 JSON 对象,其中包含有关用户朋友的数据库信息。然后在用户的计算机上交叉引用这两个列表。
这种方法的明显安全漏洞是,任何人都可以向我的处理程序发送一个带有任意人的 Facebook ID 的请求,而不需要以该人的身份登录到 Facebook 并获取该人提供有关他们朋友的所有信息。毕竟,Facebook ID 是公开可用的。
我能想到的确保用户身份的方法,除了实现自己的登录系统外,就是在AJAX请求中包含用户的访问令牌,因为访问令牌是证明用户已经登录Facebook的凭证。然后,请求处理程序可以向Facebook Graph API发出虚拟请求以验证其有效性。但是,这似乎有些hacky,并且我不确定如何处理访问令牌在传输到App Engine服务器时过期的可能性。我也研究了 Facebook Python SDK,但我不确定它如何帮助解决问题。
App Engine服务器如何验证Facebook用户是否已登录我的Facebook应用程序?
1个回答

4
尝试使用 signed_request 代替发送纯粹的 facebookID - 这样你就可以在服务器上解码它们,使用 Facebook APP 页面上给出的 secret_id。然后,没有人能够向您发送“伪造”的查询,因为它们将无法在服务器端进行解密。
例如,我有一个应用程序,允许用户对给定条目进行投票。用户接受权限后,我使用 JavaScript 将他的投票发送到服务器:
$.ajax({
            type: "POST",
            url: base_url + 'vote/send',
            data: { signed_request: response.authResponse.signedRequest, vote:vote },
});

在服务器端,我正在解码signed_request以获取用户的FacebookID,并将其存储为合法投票...通过这种方式,没有人能够向我发送虚假投票,因为signed_request是以只有我的应用程序能够解码的方式进行加密的。
当然,响应是来自SDK的对象,在用户批准使用应用程序的权限后。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接