身份验证 – 使用JSONP和Cookie进行跨域登录
如何允许用户登录一个域并自动登录到我的其他域,而不必在每个域上提交表单?
我们都知道,Cookie无法访问跨域,因为这会带来安全隐患.然而,使用一些诡计,有这方面的方法.基本上我们在中央域上为用户设置一个cookie,使用脚本检查该cookie的存在,然后使用
JSON-P回调将该cookie复制到其他域.更详细地说:
在登录 步骤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 下次用户刷新页面时,我们可以绕过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删除,用户被有效地注销. 笔记 >第4步的central.com/check是至关重要的正确的标题设置为不缓存.>用户登录时的步骤3-5可能会导致轻微的延迟.刷新并显示他们登录的某种JavaScript警报是明智的,对于步骤3的脚本尽可能接近页面顶部也很重要.>在步骤5中,您可以选择在每个域上存储唯一的cookie值.>独立的central.com域不是真的必要;您可以如果您愿意,只需使用其他域名之一作为中央域名.这个领域的逻辑显然会有所不同.>为了在Internet Explorer上工作,您将需要一个P3P策略附在你的饼干上>正如IvanGusev在评论中指出的那样,这种方法的一个缺点是,如果用户退出设备A,它也会将其从其他设备中注销.希望对人有帮助.我很有兴趣收到反馈,特别是如果有任何安全漏洞方法.我认为最糟糕的一个黑客可以做的是复制步骤3-5,并登录到mydomain.com,而不知道,但这将是无害的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |