前后端分离如何实现单点登录?

假设api接口为api.a.com
在login.a.com完成了登录操作
实现在访问b.com和c.com时默然为登录状态
用户login后,后端会返回一个token标识用户
无论是cookie还是localStorage都是不能跨域访问的,如何在跨站是能拿到用户标识,保存用户状态呢?
类似淘宝登录后,访问天猫时已登录
求给一个解决思路

阅读 21.8k
9 个回答

访问b.com,用户需要登录跳转到login.a.com,验证登录成功信息cookie存在login.a.com下面,并将其当成url参数返回到b.com并存cooike到b.com,下次打开b.com就不需要跳转登陆了。
这时候访问c.com,又跳转login.a.com直接将cookie信息返回到c.com并存起来。

不是b.com, c.com默认为登录状态.

而是访问b.com, c.com时, 先跳转到login.a.com, 因为在a.com上已经登录, 所以直接跳转回b.com, c.com, 同时把登录信息带上.

说2个简单方法把:
1.类似ucenter的逻辑,按你举例,3个站,登录时候,调用每个站的一个页面,就ok了,解决了你的跨域
2.跨站链接加参数,比如你的a.com跳转b.com时候,链接为b.com?access_token=dskfakldjfi

一个项目地址为a.aaa,另一个是a.bbb,可以用cross-storage,吧token放在a下

前面几个人讲流程的基本正确:

  1. 访问b.com,b.com发现用户没登陆,跳转到a.com

  2. a.com发现用户已经在a.com登陆,再跳转回b.com,将登陆信息带上

问题就是所谓的登陆信息是什么,这个肯定不是cookie,也不会是用户名密码什么的。

这个需要a.com和b.com相互约定传的是什么东西。

你可以参考CAS相关文档。

用户访问www.domain.com的时候,ajax异步(跨域)请求http://api.domain.com/check_l... 检查是否已经登录。至于解决跨域问题,可以通过jsonp或者api.domain.com服务器配置Access-Control-Allow-Origin 允许跨域请求。如果之前已经在api.domain.com登录过,那么浏览器会缓存登录信息,去请求URL的时候,会自动带上相关的cookie/session,该接口可以返回登录账户相关个人信息或者别的想要的信息;如果没有登录,则跳转到登录页面。

1.[b.com]在发现未登录时跳转至[a.com]进行登录
2.[a.com]在登录完成后将登录authcookie与用户信息记录到服务器(session_id或者redis都可以)
3.同时[a.com]创建一个令牌token关联上一步的authcookie,并带回[b.com]backUrl
4.[b.com]拿到[a.com]发回来的令牌去调用[a.com]的接口查询是否令牌有效并且可以查到用户信息,有的话则拿回数据并做后续操作

以上是单点登录的基本流程,PS:单点登录与前后端分离没有关系。

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