3

我正在编写一个列出用户朋友的 Facebook 应用程序,并与用户提供的有关他们的信息(存储在 Google App Engine 数据库中)进行交叉引用。这是我的应用程序的运行方式:

用户登录 Facebook 后,通过 Facebook 的 Javascript SDK 调用 Graph API 以获取他们的好友列表。同时,将 AJAX 请求与用户的 Facebook ID 一起发送到我的 Google App Engine 请求处理程序,该处理程序将返回一个 JSON 对象,其中包含来自数据库的有关用户朋友的信息。然后在用户的计算机上交叉引用这两个列表。

这种方法的明显安全缺陷是,任何人都可以使用任意人的 Facebook ID 向我的处理程序发送请求,而无需以该人身份登录 Facebook,并获取该人提供的有关其朋友的所有信息。毕竟,Facebook ID 是公开的。

除了实现我自己的登录系统之外,我能想到的确保用户身份服务器端的唯一方法是在 AJAX 请求中包含用户的访问令牌,因为访问令牌是用户登录到 Facebook 的证明。然后,请求处理程序可以向 Facebook Graph API 发出一个虚拟请求,以验证它是否有效。但是,这似乎很棘手,我不确定如何处理访问令牌在传输到 App Engine 服务器时过期的可能性。我还研究了Facebook Python SDK,但我不确定这可能有什么帮助。

App Engine 服务器如何验证 Facebook 用户是否已登录到我的 Facebook 应用程序?

4

1 回答 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 被加密了,只有我的应用程序是能够解码它。

response 当然是对象,在用户批准应用程序使用权限后来自SDK。

于 2013-07-08T07:10:01.273 回答