在登录
步骤1
< form>显示在mydomain.com(或myotherdomain.com等)应该POST到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可以嵌入此脚本并获取用户的信息. (将适当的访问控制标头设置为仅允许经过验证的域可以减轻此风险).而是基于时间戳创建一次性散列,以便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
然后执行回调函数,在mydomain.com上设置cookie.最后,我们可以刷新页面,也可以使用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
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删除,用户被有效地注销.
笔记
>第4步的central.com/check是至关重要的正确的标题设置为不缓存.>用户登录时的步骤3-5可能会导致轻微的延迟.刷新并显示他们登录的某种JavaScript警报是明智的,对于步骤3的脚本尽可能接近页面顶部也很重要.>在步骤5中,您可以选择在每个域上存储唯一的cookie值.>独立的central.com域不是真的必要;您可以如果您愿意,只需使用其他域名之一作为中央域名.这个领域的逻辑显然会有所不同.>为了在Internet Explorer上工作,您将需要一个P3P策略附在你的饼干上>正如IvanGusev在评论中指出的那样,这种方法的一个缺点是,如果用户退出设备A,它也会将其从其他设备中注销.希望对人有帮助.我很有兴趣收到反馈,特别是如果有任何安全漏洞方法.我认为最糟糕的一个黑客可以做的是复制步骤3-5,并登录到mydomain.com,而不知道,但这将是无害的.