JS API 的FB.login
方法返回一个包含用户信息字典的响应,包括用户 ID。这存在于 JS api 中的客户端。
如果这将被发送回运行 facebook 画布应用程序的服务器,服务器必须相信用户 ID 没有被篡改。由于响应没有返回签名校验和,我看不出如何保证这一点。
我可以看到您如何从 POST 签名请求中获取用户 ID 并将其存储在会话中,但这似乎不太正确。我敢肯定,有一种方法可以安全地做到这一点,而且没有那么巴洛克式。
想法?
JS API 的FB.login
方法返回一个包含用户信息字典的响应,包括用户 ID。这存在于 JS api 中的客户端。
如果这将被发送回运行 facebook 画布应用程序的服务器,服务器必须相信用户 ID 没有被篡改。由于响应没有返回签名校验和,我看不出如何保证这一点。
我可以看到您如何从 POST 签名请求中获取用户 ID 并将其存储在会话中,但这似乎不太正确。我敢肯定,有一种方法可以安全地做到这一点,而且没有那么巴洛克式。
想法?
您应该对服务器使用服务器端身份验证。
当用户加载您的应用程序但尚未进行身份验证时,您将他发送到身份验证对话框,当他返回时您会得到一个代码,然后您与 facebook 服务器交换该代码以获取访问令牌,然后您可以查询图形 api 以获取“ /me" 并获取用户数据,因为您是从 facebook 服务器获取的,所以您知道没问题。
此外,当 facebook 发布到您的画布 url 时,您会收到一个使用您的应用程序密码签名的签名请求,在您对其进行解码后,您可以根据您的密钥检查它以验证其真实性。此外,签名请求具有用户 ID,因此您知道它也是安全的。
我建议同时使用服务器端身份验证和客户端身份验证,您会获得不同的令牌(服务器为 60 天,客户端为几个小时),您可以同时使用它们。