关于跨域登录

有这样两个网站,a.com和b.com,在登录网站a.com后,进入b.com自动登录,反过来也一样。总之两个网站的登入登出状态保持同步。
此外,在a.com和b.com之外,还有无数同样的不同域名的网站需要同步登录状态。

例如多说评论系统,登录一次后,在其他使用多说的网站可以免登陆,这是如何做到的?

阅读 7.3k
7 个回答

SSO(single sign on)

你说的这种情况可以用上面的方案来解决,这种方案有很多实现方式,你可以去查找看一下。

我也举一个简单的例子:

当你在某个网站登录的时候,

1) 他获取了你的用户名和密码,将其发送到后台

2) 通过检验后由后台生成一个加密认证字符 oauth

3) 然后向前台发送信息说你成功登录,同时再利用后台脚本向一系列指定的域名下插入相关认证信息。

这样你虽然只是在一个域名下登录了,但是其他域名下也有了你的认证信息。当然上述只是一种实现方案,还有一些

实现方式和这种差的挺大的。

浏览器所有保存状态的方法,都是按域保存的。以cookie为例,假设你是要在a.com使用b.com的授权登录,当你登录的时候调用了oauth,那么其实你是跳转到b.com进行登录的,那么你的浏览器就会保存b.com登录状态。那么当你在c.com登录的时候,你的浏览器已经保存了b.com的登录状态,那么自然就可以自动登录了。当然,a.comc.com在浏览器中是无法获取到b.com的状态的。

给你几个关键字吧,单点登录、document.cookie domain(当然还有其他的方法。)

简单的理解:所有的网站都查询一个只做登录的服务器

这个多个域名之间共享登陆态的问题。
通常一个网站登陆时都会生成session然后向浏览器下发cookie,其中大多数场景的sessionid是存入cookie中的。
如果多个网站想要共享登录态,只需要共同制定一套session生成规则,然后session写入一个共同可访问的存储区(如redis,db等)即可。
例如PHP网站a.com与b.com网站想要共享登录态,且session数据存入redis中:
如果用户先登录a.com,那么由a.com服务端生成session,并将session存入redis中,同时会想浏览器端下发一个key为PHPSESSION的cookie;然后用户打开b.com登录时,b.com服务端后端会首先判断PHPSESSION是否存在,如果存在且cookie没过期,则拿到PHPSESSION的cookie值(一般为session id),去redis中查询,如果查询到对应的sessino数据,即可完成登陆;如果查询不到(例如session数据过期),则重新登陆。此时a.com再登陆时,也是通过上次步骤依次判断,即可完成登陆。

很简单!
以下是三个域名公用的sid:
image.png
以wps 登陆为例

  1. 点击a.com,点击登录,带上参数redirct=a.com,重定向到login.com
  2. 进入登陆中心 login.com 进行登录
  3. 登陆成功,返回参数之前传递的参数以及session,根据之前的参数a.com,带上session参数跳转到a.com
  4. 在a.com使用session请求相关用户信息
  5. 如果此时新打开一个tab,输入b.com,在代理服务器进行发,带上参数redirct=b.com,进入login.com,浏览器检查到对应的之前login.com下的session,说明以及登录过了;直接带着session进入b.com;

以上使用login.com作为中间登录中心。再利用重定向的方式进行中转。从而实现了sso单点登录;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏