`

实现跨域cookie共享

 
阅读更多
问题描述:在一个比较复杂的网站环境下。有多个产品向外提供服务。每个产品下都有自己的用户登录界面。现在需要设计一个统一的登录界面。 当用户在这个界面登录后就可以自由的使用各个产品和服务。同时意味着用户用一个帐号可以在不同服务里登录,另一方面就是在一个服务里面登录后可以无障碍的 漫游到其他服务里面去。

实际应用:Sohu的Passport将focus.cn,17173.com,sogou.com,chinaren.com这四个域 名下的产品全部整合在一起了。用户在这四个站点中任何一个地方都可以登录。当用户登录后可以自由的使用其他域名下的服务。现在很多网站上都有bbs blog album服务。这些服务一般也是自己维护自己的用户信息。当发展到一定时候,也需要一个Passport机制整合所有服务,使用户可以单点登录。

Sohu的实现方案在http://passport.sohu.com/ 登录后 fiddler可以拦截到如下的返回信息:

由于passport.sohu.com的登录界面使用了iframe隐藏提交。所以页面没有看到刷新。隐藏的iframe把用户名和加 密的password和其他信息发送给了passport.sohu.com。passport.sohu.com在Response中设置了成功登录的 cookie。这个cookie可以证实这个用户成功登录了passport.sohu.com。

当用户在Passport成功登录后。客户端的Javascript根据成功登录的标志,操作iframe请求 http://passport.sohu.com/sso/crossdomain_all.jsp?action=login 因为在同一个域名下,没有跨域,在这次请求中,上次成功登陆的cookie会被一并带着回去。服务器端检查到成功登录的cookie后会Render回一 段同时登录多个站点的html。

这段html 要向4个地址发送请求。截至到现在都是在相同的Domain(passport.sohu.com)请求和返回,为真正的跨站点登录做准备,真正的跨站点 登录还没有开始。下面passport.sohu.com通过sso/crossdomain.jsp 在服务器端进行Redirect 设置http head 为302进行跳转。跳转后在这个跳转后的域名下设置登录成功的cookie。这就是sohu实现跨站点登录的核心过程。下面是 passport.sohu.com登录17173.com的过程。

1. 通过http://passport.sohu.com/sso/crossdomain_all.jsp?action=login Render回来的script <script type="text/javascript" src="http://passport.sohu.com/sso/crossdomain.jsp?action=login&domain=17173.com"></script> 请求同域下的http://passport.sohu.com/sso/crossdomain.jsp?action=login& domain=17173.com 这时passport.sohu.com下成功登录的cookie会被带回去。

2. 服务器看到成功登录的Cookie后。在服务器端计算出一个加密后的17173.com的登录Url,并Redirect到这个Url。

3. 17173.com从url的QueryString中取得信息。并在Response中设置Cookie。这个Cookie终于写到了 17173.com下。而不是passport.sohu.com下。从而使得用户在17173.com下登录。其实用户在17173.com下手动登录 也是写上同样的Cookie。以后用户再访问17173.com的页面时这个Cookie会被带回去。这就表示用户在17173.com下成功登录过了。

经过上面的步骤。用户在passport.sohu.com下登录的同时也在其他站点登录了。

在上面的过程中,最核心的技巧就是在指定的域下写入想要的Cookie:

1. Sohu使用了在同一个域名登录后通过再次请求这个域名下某个链接后,得到要登录站点的请求Url,通过javascript使隐藏的iframe请求要 登录站点的Url,服务器端接到请求Redirect到要登录站点,然后通过Response写入Cookie,完成跨域名写Cookie的操作。这种写 Cookie的方式,需要在跳转时对请求的QueryString进行加密。接受方需要对QueryString进行解密。

2. 这种做法在服务器端不需要特别的处理。只要写好相应Post操作 WriteCookie操作 Redirect操作就可以了。在FireFox下就可以正常工作了。但是在IE下写Cookie的操作还不行,总是写不进去Cookie。需要在Response中加入一段特别的Header. P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"

这个Http Header 是P3P安全的要求。P3P的详解 http://www.oreilly.com.cn/book.php?bn=7-302-07170-5 微软对这个的解释:http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q323752

一个更加轻量级的方案

Sohu的通行证方案已经可以轻松的将各个域名下的用户都同步登录了。但是在实现上Sohu会让客户端的浏览器请求两次 passport.sohu.com。在第二次得到一个登录多个站点的地址列表。在第三次请求时通过本域下的cookie进行身份验证,最后在服务器端跳 转到一个含有加密Key的其它域名的Url地址,最终写入登录成功的Cookie。除去最开始的登录,要求用户在登录后再进行两次请求。并且服务器端要再 做一次跳转。Sohu的做法可能由于Sohu服务器环境和数据存储的结构所决定。

其实总共只需一次登录请求,和每个域名下一次请求就可以完成多站点登录了,同时也不需要服务器端的跳转。

跨站点的请求由script的src发出。各个域名下的ssologin处理QueryString中的key,解密key,验证Key的合法性。在Response中写入登录成功的Cookie。完成跨站点Cookie的写入。

两种方案的比较

1. Sohu使用的登录方式,请求次数多,但是每次请求都有对应的验证过程,在服务端跳转时,重要的跳转Url地址在HttpHeader中,使得跳转地址更加安全,使得用户在跨域登录时非常安全可靠。

2. 轻量级方案的登录方式,请求次数少,没有服务器端的跳转,对服务器压力小。但是需要对Key进行加密解密。跳转的Url会在Response的Http Body中Render给用户。在使用轻量级方案的时候,最好在Key中加上时间戳,过期时间设置为3分钟。Key过期认为这个Key是非法Key,不在 Response中写入登录成功的Cookie。

分享到:
评论

相关推荐

    解决springboot实现跨域session共享问题

    为了实现跨域session共享,我们可以使用例如Redis或Memcached这样的分布式缓存来存储session。首先,需要添加相应的依赖到`pom.xml`或`build.gradle`文件中,然后配置Spring Boot的session存储机制: ```java @...

    如何使用localstorage代替cookie实现跨域共享数据问题

    因为cookie在跨域的情况下,浏览器根本不允许互相访问的限制,为了突破这个限制,所以有了以下这个实现方案,使用postmessage和localstorage进行数据跨域共享。 原理比较简单,但是遇到的坑也不少,这里梳理一下,做...

    session、cookie的跨域共享

    该文件可以通过代码实例,让你清楚的理解session和cookie的意思,当你明白了这点,你就可以设计出来单点登录功能,同一账号在同一时间只能登录一次功能。同时你可以通过ie、firefox去测试你对session、cookie的理解...

    跨域共享session (实现http跳转https 共享session)

    通常,由于浏览器的安全策略,不同源的Web应用程序之间不能共享Cookie,其中包括用于存储session信息的Cookie。但是,为了提供更好的用户体验,特别是在单点登录(Single Sign-On, SSO)场景下,跨域共享session变得...

    php跨域cookie共享使用方法

    本文将详细讲解如何使用PHP来实现跨域Cookie的共享。 首先,我们要了解同源策略的基本概念。同源策略是浏览器为了保护用户安全而设定的一种机制,它规定了只有来自同一协议(http或https)、同一域名、同一端口的...

    跨域访问解决方案,关于跨域访问cookie的资料

    #### 二、关于跨域访问Cookie的处理 在跨域访问中处理Cookie是一项重要的任务,因为Cookie往往包含用户的认证信息。在跨域请求中,默认情况下Cookie不会被发送。因此,在某些场景下需要显式地配置服务器端允许发送...

    PHP实现cookie跨域session共享的方法分析

    这个过程利用了iframe的同源策略例外,以及JavaScript的跨窗口通信能力,实现了跨域Cookie的共享。 ### Session共享 Session共享通常用于同一服务器下的多个应用间,或分布式服务器环境。PHP本身并不支持跨服务器...

    session跨域的共享--更改配置

    - **兼容性**:不同浏览器对于cookie的处理方式可能有所不同,特别是对于跨域cookie的支持。确保测试你的应用在各种浏览器中的表现。 ### 四、结论 通过调整PHP的配置参数,我们可以有效地实现session的跨域共享,...

    Dubbox跨域请求、Cookie设置

    【标题】"Dubbox跨域请求、Cookie设置"所涉及的知识点主要集中在分布式服务框架Dubbo的跨域问题处理和Cookie的配置上。Dubbox是阿里巴巴开源的一个基于Dubbo的扩展,提供了更多的特性,如REST支持、Zookeeper注册...

    跨域携带cookie案例.rar

    在现代Web应用中,前后端分离的架构设计已经成为主流,随之而来的是跨域资源共享(CORS)的问题。本文将深入探讨“跨域携带cookie”的案例,重点解析如何通过nginx服务器解决这一问题。首先,我们需要理解什么是跨域...

    Session跨域共享demo

    针对这一问题,我们可以利用特定的技术实现Session跨域共享,使得用户在访问多个相关联的二级域名时,依然能享受到无缝的体验。 本示例"Session跨域共享demo"是基于ASP.NET框架,适用于高版本的开发环境,如Visual ...

    跨域资源共享CORS协议介绍

    跨域资源共享(CORS)是一种安全机制,允许一个域(网站)上的Web应用访问另一个域上的资源。随着Web应用变得越来越复杂,为了增强用户体验,经常需要在一个域名下发起对另一个域名的HTTP请求。CORS的出现解决了...

    SpringBoot 中实现跨域的5种方式.pdf

    本文档介绍了在SpringBoot应用中实现跨域资源共享的5种方式,包括使用CorsFilter、重写WebMvcConfigurer、使用注解@CrossOrigin、手动设置响应头以及在SpringBoot 2.4.x中对@CrossOrigin的支持情况。 首先,通过...

    golang实现跨域访问的方法

    本篇将详细解释如何在Golang后端设置CORS(跨域资源共享)策略,以便允许前端进行跨域请求。 首先,了解跨域的原理。由于浏览器的安全策略,JavaScript的Ajax请求只能访问同一源(协议+域名+端口)下的资源,这是...

    Spring Boot Redis Session 共享(Ajax 跨域)

    在现代Web应用开发中,数据共享和跨域访问是常见的需求。Spring Boot作为一个轻量级的框架,提供了方便快捷的方式来实现这些功能。本教程将详细讲解如何在Spring Boot项目中利用Redis来存储和共享Session,并解决...

    sso实现跨域登录实例,确实不错哦。

    浏览器的同源策略限制了不同域名之间的数据共享,但可以通过设置Cookie的`domain`属性使其在多个关联域名间生效。 5. **协议实现**:常见的SSO协议有CAS、OAuth、OpenID Connect等。在这个实例中,可能使用的是CAS...

Global site tag (gtag.js) - Google Analytics