更多相关文章请见:Spring Security文章目录
1、简介
某些场景下 单点登录系统sso 和 应用系统sso-client直接网络无法联通,可以考虑直接使用implicit方式的oauth2 + jwt 进行实现。
实现目标:
- 多应用系统单点登录功能(一次登录,访问多个系统,默认通过sso会话实现登录保持,集群环境可以考虑将session也转成token)。
- 应用系统 token 鉴权访问,一个token,可以访问所有应用系统资源。
注:authorization_code 方式,多了code换取token步骤,需要应用系统能够访问到单点登录系统。
1.1、oauth2 简介:
需要注意几个角色:
- 授权系统:发放token的系统,就是我们的sso。
- 资源系统(应用系统):使用token校验权限的系统,就是我们的sso-client。
- 用户:页面操作人,持有用户名、密码。
五种场景
- authorization_code:授权码类型,授权系统针对登录用户下发code,应用系统拿着code去授权系统换取token。
- implicit:隐式授权类型。authorization_code的简化类型,授权系统针对登录系统直接下发token,302 跳转到应用系统url。
- password:资源所有者(即用户)密码类型。应用系统采集到用户名密码,调用授权系统获取token。
- client_credentials:客户端凭据(客户端ID以及Key)类型。没有用户参与,应用系统单纯的使用授权系统分配的凭证访问授权系统。
- refresh_token:通过授权获得的刷新令牌 来获取 新的令牌。
1.1、implicit 简单介绍
参考: RFC规范
流程图如下:
+----------+
| Resource |
| Owner |
| |
+----------+
^
|
(B)
+----|-----+ Client Identifier +---------------+
| -+----(A)-- & Redirection URI --->| |
| User- | | Authorization |
| Agent -|----(B)-- User authenticates -->| Server |
| | | |
| |<---(C)--- Redirection URI ----<| |
| | with Access Token +---------------+
| | in Fragment
| | +---------------+
| |----(D)--- Redirection URI ---->| Web-Hosted |
| | without Fragment | Client |
| | | Resource |
| (F) |<---(E)------- Script ---------<| |
| | +---------------+
+-|--------+
| |
(A) (G) Access Token
| |
^ v
+---------+
| |
| Client |
| |
+---------+
简要说明:
- Resource Owner:用户,用户名、密码持有人。
- User-Agent:可以简要理解为浏览器。
- Client:资源调用请求发起方,对于我们的demo来说,发起请求的浏览器就是客户端。
- Authorization Server:授权系统,包含用户名密码采集和验证。
- Web-Hosted Client Resource:资源系统,提供受保护的资源。
所以,对于我们来说,实际流程大体为:
其中 sso的 登录判断 和 上一步的url 默认都是通过session来实现的,如果想要集群化,可以将这两步改造成外部缓存(如 redis),或者交给客户端保持(如:jwt 生成 token 存放在 cookie )。