身份验证 – 使用JSONP和Cookie进行跨域登录

前端之家收集整理的这篇文章主要介绍了身份验证 – 使用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,而不知道,但这将是无害的.

猜你在找的Json相关文章