2024-08-23 16:18:24 +08:00
|
|
|
|
# OAuth2 与登录会话实现数据互通
|
2022-02-06 18:06:55 +08:00
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
### 前提
|
|
|
|
|
|
|
|
|
|
前提,我们:
|
|
|
|
|
- 把 OAuth2 模块生成的令牌称作资源令牌(access_token),
|
|
|
|
|
- 把 StpUtil 登录会话生成的令牌称作会话令牌(satoken)。
|
|
|
|
|
|
|
|
|
|
正常情况下,资源令牌 与 会话令牌 的数据是不互通的,具体表现就是:当我们拿着 access_token 去访问 satoken 令牌的接口,会被抛出异常:`无效Token:xxxxx`
|
|
|
|
|
|
|
|
|
|
那么,有什么办法可以做到这两个模块的数据互通呢?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### OAuth2-Server 端数据互通
|
|
|
|
|
|
2024-08-23 16:18:24 +08:00
|
|
|
|
很简单,你只需要在 `configOAuth2Server` 中重写 Access-Token 的生成策略:
|
2022-02-06 18:06:55 +08:00
|
|
|
|
|
|
|
|
|
``` java
|
2024-08-23 16:18:24 +08:00
|
|
|
|
// Sa-Token OAuth2 定制化配置
|
|
|
|
|
@Autowired
|
|
|
|
|
public void configOAuth2Server(SaOAuth2ServerConfig oauth2Server) {
|
|
|
|
|
// 其它配置 ...
|
2022-02-06 18:06:55 +08:00
|
|
|
|
|
2024-08-23 16:18:24 +08:00
|
|
|
|
// 重写 AccessToken 创建策略,返回会话令牌
|
|
|
|
|
SaOAuth2Strategy.instance.createAccessToken = (clientId, loginId, scopes) -> {
|
|
|
|
|
System.out.println("----返回会话令牌");
|
2024-08-24 17:55:46 +08:00
|
|
|
|
return StpUtil.getOrCreateLoginSession(loginId);
|
2024-08-23 16:18:24 +08:00
|
|
|
|
};
|
|
|
|
|
|
2022-02-06 18:06:55 +08:00
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
重启项目,然后在 OAuth2 模块授权登录,现在生成的 `access_token` ,可以用来访问 `satoken` 的会话接口了。
|
|
|
|
|
|
|
|
|
|
|
2024-08-23 16:18:24 +08:00
|
|
|
|
> [!WARNING| label:注意点]
|
|
|
|
|
> 数据互通,让前端与后端的交互更加方便,一个 token 即可访问所有接口,但也一定程度上失去了OAuth2的 “不同 Client 不同权限” 的设计意义,
|
|
|
|
|
> 同时也默认每个 Client 都拥有了账号的会话权限(access_token 与 satoken 为同一个)。
|
|
|
|
|
>
|
|
|
|
|
> 应该根据自己的架构合理分析是否应该整合数据互通。
|
|
|
|
|
|
|
|
|
|
|
2022-02-06 18:06:55 +08:00
|
|
|
|
### OAuth2-Client 数据互通
|
2025-03-01 21:15:37 +08:00
|
|
|
|
除了Server端,Client端也可以打通 `access_token` 与 `satoken` 会话。做法是在 Client 端拿到 `access_token` 后进行登录时,使用 `SaLoginParameter` 预定登录生成的 Token 值
|
2022-02-06 18:06:55 +08:00
|
|
|
|
|
|
|
|
|
``` java
|
|
|
|
|
// 1. 获取到access_token
|
|
|
|
|
String access_token = ...
|
|
|
|
|
|
|
|
|
|
// 2. 登录时预定生成的token
|
|
|
|
|
StpUtil.login(uid, SaLoginConfig.setToken(access_token));
|
|
|
|
|
|
|
|
|
|
// 3. 其它代码...
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|