我正在编写一个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应用程序?
答案 0 :(得分: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后用户批准使用app的权限。