Authentication 使用JSONP和Cookie跨域登录

Authentication 使用JSONP和Cookie跨域登录,authentication,cookies,login,cross-domain,jsonp,Authentication,Cookies,Login,Cross Domain,Jsonp,我如何允许用户登录到一个域并自动登录到我的其他域,而不必在每个域上提交表单?我们都知道,跨域访问cookie是不可能的,因为这会带来安全风险。然而,使用一些诡计,有办法解决这个问题。基本上,我们在中心域上为用户设置cookie,使用脚本检查cookie是否存在,然后使用JSON-P回调将cookie复制到其他域。更详细地说: 登录 步骤1 显示在mydomain.com(或myotherdomain.com等)上的应该发布到central.com/login 步骤2 在central.com/l

我如何允许用户登录到一个域并自动登录到我的其他域,而不必在每个域上提交表单?

我们都知道,跨域访问cookie是不可能的,因为这会带来安全风险。然而,使用一些诡计,有办法解决这个问题。基本上,我们在中心域上为用户设置cookie,使用脚本检查cookie是否存在,然后使用JSON-P回调将cookie复制到其他域。更详细地说:

登录 步骤1

显示在
mydomain.com
(或
myotherdomain.com
等)上的
应该发布到
central.com/login

步骤2

central.com/login
上,验证用户名和密码,并在
central.com
域上设置cookie,其中包含该用户的唯一值。然后将用户重定向回
mydomain.com

SELECT unique_value FROM users WHERE username = $username
set cookie on central.com containing unique_value
delete cookie on central.com
UPDATE users SET unique_value = new_random_value() WHERE username = $username
步骤3

回到
mydomain.com
我们嵌入了对
central.com/check
的javascript调用

<script type="text/javascript" src="http://central.com/check"></script>
步骤5

然后执行回调函数,在
mydomain.com
上设置cookie。最后,我们可以刷新页面,也可以使用JavaScript提醒用户他们已登录(最好两者都是)

mydomain.com/setcookie
类似于步骤2。当然,这假设两个站点都可以访问相同的数据库(和代码)

步骤6

下次用户刷新页面时,我们可以绕过JSON-p回调

if cookie on mydomain.com is valid
    loggedin = true
else
    delete cookie on mydomain.com
    proceed to Step 3
注销 步骤7

mydomain.com
上的链接应转到
central.com/logout

步骤8

central.com/logout
上,不仅会删除cookie,还会重置该用户的唯一值。用户被重定向回
mydomain.com

SELECT unique_value FROM users WHERE username = $username
set cookie on central.com containing unique_value
delete cookie on central.com
UPDATE users SET unique_value = new_random_value() WHERE username = $username
步骤9

现在唯一值已重置,上面的步骤6失败,cookie也将从
mydomain.com
中删除,用户将有效注销

笔记
  • 步骤4中的
    central.com/check
    具有 设置正确的标头,使其不被缓存

  • 用户登录时的步骤3-5可能会导致轻微延迟。明智的做法是刷新并显示某种JavaScript警报,提醒他们已登录。步骤3中的脚本尽可能靠近页面顶部也很重要

  • 在步骤5中,您可以选择在每个域上存储唯一的cookie值

  • 单独的
    central.com
    域实际上是不必要的;你可以 如果您愿意,只需使用其他域之一作为中心域。 该领域的逻辑显然会有所不同

  • 要在Internet Explorer上执行此操作,您需要P3P策略 附在你的饼干上

  • 正如IvanGusev在评论中指出的那样,这种方法的一个缺陷是,如果用户从设备A注销,它也会将他们从其他设备注销

  • 希望这对大家有帮助。我很想收到你的来信 反馈,特别是如果存在任何安全缺陷 方法。我认为黑客最糟糕的做法是复制第3-5步,在你不知道的情况下登录到
    mydomain.com
    ,但这是无害的


  • 回答得很好。然而,我也想知道使用这种方法是否存在任何安全缺陷。希望有比我更有经验的人插话……但是不同的设备呢?如果你注销了设备A,B会怎么样?@IvanGusev是的,这是一个缺陷。它将使您从所有设备注销。一种可能的解决方案是,您可以为每个用户存储多个唯一密钥,并在他们从新设备登录时生成一个新密钥。一种想法是仅在“mydomain”上存储唯一值。但需要决定何时储存:我认为应该是第五步。所以,如果用户在设备A上注销,在设备B中,他将自动重新登录。
    delete cookie on central.com
    UPDATE users SET unique_value = new_random_value() WHERE username = $username