方案设计

项目简介

sso + oauth(单点登录和开放授权)

知识点

并不是所有系统支持cookie机制,所以需要使用token机制。

方案设计

SSO系统生成一个token,并将用户信息存到Redis中,并设置过期时间,其他系统请求SSO系统进行登录,得到SSO返回的token,写到Cookie中,每次请求时,Cookie都会带上,拦截器得到token,判断是否已经登录

未授权时支持302跳转和401响应

前后端分离方式,这种方式下业务方调用后端的接口时不希望得到302跳转,而是得到一个未授权的结果,在以下两个条件之一满足时:

  1. ContentType为application/json或application/xml

  2. 请求携带Header,x-requested-with:XMLHttpRequest

同样在前后端分离场景中,当业务方调用后端接口时不方便传递cookie时(例如涉及到跨域cookie种植的问题),可以使用在请求头添加“access-token”和"client-id"的方式向后端请求接口,该方式等同于携带${clientId}_ssoid(即access-token)的cookie

POST /index.html (or /api/getdata) HTTP/1.1 //适用普通请求和ajax请求
access-token:${ssoid} //放置在Header里,其中ssoid由应用鉴权方负责获取
client-id:$(clientId) //颁发对应ssoid的clientId

前后端分离项目

由于cookie存在跨域问题,前后端域名不同的时候,需要由前端来完成种cookie的操作

JWT

会话session

使用全局会话和局部会话,集群存在session共享问题,同时服务端消耗过大。

Oauth2.0

基于oauth协议登录,每次访问向sso-server验证token

优化点

  1. Nginx的rewrite解决方案

  2. 当用户长时间不登录,cookie过期,如何使用refresh token 来重新刷新 access token

OAuth2.0授权与单点登录的区别

根据OAuth2.0授权与单点登录的概念,我们可以得知二者至少存在以下几点区别:

  • 从信任角度来看。OAuth2.0授权服务端和第三方客户端不属于一个互相信任的应用群(通常都不是同一个公司提供的服务),第三方客户端的用户不属于OAuth2.0授权服务端的官方用户;而单点登录的服务端和接入的客户端都在一个互相信任的应用群(通常是同一个公司提供的服务),各个子系统的用户属于单点登录服务端的官方用户。

  • 从资源角度来看。OAuth2.0授权主要是让用户自行决定——“我”在OAuth2.0服务提供方的个人资源是否允许第三方应用访问;而单点登录的资源都在客户端这边,单点登录的服务端主要用于登录,以及管理用户在各个子系统的权限信息。

  • 从流程角度来看。OAuth2.0授权的时候,第三方客户端需要拿预先“商量”好的密码去获取Access Token;而单点登录则不需要。

参考资料:

  1. https://juejin.im/post/5cdd42f9518825693f1ebf8d

  2. http://www.ruanyifeng.com/blog/2019/04/github-oauth.html

  3. https://www.zhihu.com/topic/19730683/hot

Last updated