Authentication 使用JSONP和Cookie跨域登录
我如何允许用户登录到一个域并自动登录到我的其他域,而不必在每个域上提交表单?我们都知道,跨域访问cookie是不可能的,因为这会带来安全风险。然而,使用一些诡计,有办法解决这个问题。基本上,我们在中心域上为用户设置cookie,使用脚本检查cookie是否存在,然后使用JSON-P回调将cookie复制到其他域。更详细地说: 登录 步骤1 显示在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
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
中删除,用户将有效注销
笔记
central.com/check
具有
设置正确的标头,使其不被缓存central.com
域实际上是不必要的;你可以
如果您愿意,只需使用其他域之一作为中心域。
该领域的逻辑显然会有所不同mydomain.com
,但这是无害的回答得很好。然而,我也想知道使用这种方法是否存在任何安全缺陷。希望有比我更有经验的人插话……但是不同的设备呢?如果你注销了设备A,B会怎么样?@IvanGusev是的,这是一个缺陷。它将使您从所有设备注销。一种可能的解决方案是,您可以为每个用户存储多个唯一密钥,并在他们从新设备登录时生成一个新密钥。一种想法是仅在“mydomain”上存储唯一值。但需要决定何时储存:我认为应该是第五步。所以,如果用户在设备A上注销,在设备B中,他将自动重新登录。
delete cookie on central.com
UPDATE users SET unique_value = new_random_value() WHERE username = $username