如何允许用户登录一个域并自动登录我的其他域,而不必在每个域上提交表单?
最佳答案
我们都知道Cookie无法跨域访问,因为这会带来安全风险。但是,使用一些技巧,可以解决此问题。基本上,我们在中央域上为用户设置一个cookie,使用脚本检查该cookie的存在,然后使用JSON-P回调将该cookie复制到其他域。更详细地:
在登录
步骤1
显示在<form>
(或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
步骤3
回到
mydomain.com
,我们将javascript调用嵌入到central.com/check
。<script type="text/javascript" src="http://central.com/check"></script>
步骤4
在
central.com/check
上,我们检查是否为用户设置了唯一的cookie。然后,我们嵌入一个JavaScript回调(JSON-P),通知mydomain.com
用户已登录。不包括敏感的用户数据,否则hacker.com
可以嵌入此脚本并获取用户的信息。 (将适当的Access-Control header 设置为仅允许经过验证的域可以减轻这种风险。)相反,我们根据时间戳创建一个可处理的哈希,以便mydomain.com
可以验证身份验证。if cookie on central.com is valid
user_data = array(
'success' => true,
'uid' => $uid,
'time' => time_stamp,
'hash' => disposable_salted_hash( $uid, time_stamp )
)
echo 'setDomainCookie(' . json_encode(user_data) . ')'
步骤5
然后执行回调函数,将cookie设置为
mydomain.com
。最后,我们可以刷新页面,或者只是使用JavaScript提醒用户他们已经登录(最好同时登录)。function setDomainCookie( user_data ) {
if( user_data.success ) {
$.post('/setcookie', user_data, function() {
location.reload(true);
}
}
}
mydomain.com/setcookie
与步骤2 相似。当然,这假设两个站点都可以访问相同的数据库(和代码)if hash = disposable_salted_hash( $uid, time_stamp )
SELECT unique_value FROM users WHERE uid = $uid
set cookie on mydomain.com containing unique_value
步骤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
delete cookie on central.com
UPDATE users SET unique_value = new_random_value() WHERE username = $username
步骤9
现在已重置唯一值,步骤6上面的失败,该cookie也从
mydomain.com
中删除,并且用户已被有效注销。笔记
central.com/check
必须具有设置正确的 header ,以便不进行缓存。
central.com
域。你可以只需将其他域之一用作中心域即可。
该域的逻辑显然会有所不同。
附加到您的Cookie。
反馈,尤其是在此过程中存在任何安全缺陷时
方法。我认为,黑客可能做的最糟糕的事情是复制第3-5步,并在您不知情的情况下将您登录到
mydomain.com
,但这将是无害的。 关于authentication - 使用JSONP和Cookie进行跨域登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10956488/