安全地检查用户是否已登录到另一个域(JSONP)

时间:2011-09-12 20:58:39

标签: design-patterns login facebook security

出于我的问题的目的,说有一个网络应用程序和一个不同域名的网站。用户可以登录Web应用程序,该应用程序使用户在整个会话期间保持登录状态,或者如果用户想要记住30天,则使用cookie。很标准。

现在,从网站上,我需要检查用户是否已登录到Web应用程序(在其他域上)。我显然无法直接访问浏览器的会话或Web应用程序的cookie。我相信我唯一的选择是从网站的JavaScript做一个JSONP请求到网络应用程序域的URL。然后,Web应用程序以1或0响应,具体取决于用户是否已登录。我是否朝着正确的方向前进?无论哪种方式,我都可以做一个JSONP请求并且没有太多困难得到响应。

虽然我在JavaScript中有1或0个登录值,但我需要访问站点后端代码中的值(Ruby,PHP,等等)。现在我们真正了解了我的问题的核心。这个值可以通过JavaScript存储在cookie中,但是什么阻止恶意用户手动设置此cookie?如何将此值从JSONP响应安全地传输到我的后端代码?

最后几点说明:

  1. 我无法从网站的后端代码(Ruby,PHP)向Web应用程序URL发出请求,因为用户代理是服务器,而不是Web应用程序知道登录的浏览器。
  2. 我认为Facebook Login / Connect与此类似,但很难理解所有正在查看代码的内容。对模式的解释(如果是模式)将是最有帮助的!
  3. 感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我遇到的第一件事就是让网络应用程序返回的不只是0或1,而是某种加密的令牌,然后可以在另一个域的服务器端检查。除了登录状态之外,它可能非常简单,比如md5('somethingsecret'。$ userid)。当您的外部网站后端从其前端javascript获取cookie时,只需制作相同的md5并比较这些值,以确保没有人伪造用户ID。

答案 1 :(得分:-1)

我认为你正在从围栏的错误方面接近这一点。而不是检查用户是否通过跨域JSONP请求登录(打开难以缓解的攻击向量)为什么不在两个应用程序之间发出服务器到服务器请求?

我不确定您使用的是哪个平台,但其中任何一个都应该能够向其他网站发出HTTP请求并获得有关该用户的响应。然后,您可以锁定该应用程序以仅接受来自该服务器的请求,而不是允许来自任何感觉询问的用户。