登录 Token 生成源码解析

登录 Token 生成源码解析

PIGCLOUD

📄 登录 token 生成源码解析 _ PIGCLOUD

](https://www.pig4cloud.com/)

产品

商业版

生态🔥

📄 登录 token 生成源码解析

pigcloud 2023/1/8

# 环境说明

依赖 版本
PIGX 5.6
架构模式 微服务

# 1. 登录页面

src/views/login/component/password.vue 此文件是前端账号密码登录的入口文件。此文件涉及页面验证码获取逻辑,行为验证码基于AJ-Captcha (opens new window) 实现。

# ① 密码登录页面的逻辑

# ② 前端登录成功后跳转逻辑

# 2. 前端报文加密

1
2
3
4
5
6
7
8
9
password明文:123456

转成

password密文:JFat0Zdc



Copied!

为了保证前端提交登录信息(尤其是密码字段)带后台验证过程中被抓包破解密码,PIGX 框架对登录报文进行了对称加密处理详细说明参考: 前端报文加密的业务

前端提供简单的 AES 对称加密算法,注意 key 和后端网关配置相同,这里打包混淆后,相对安全。

# 3. 网关请求转发

==网关中最重要的功能是路由转发,根据请求前缀匹配到对应服务。== 比如 所有以 /auth 开头的请求会自动转发至 pigx-auth 服务的接口处理。

以下为:sys_route_conf 表定义的路由规则

PigxRequestGlobalFilter 过滤器中另外一个重要的功能就是截取路由前缀

1
2
3
4
5
6
7
例如: http://127.0.0.1:9999/auth/oauth2/token 转发到 pigx-auth 的请求路径自动截取 前缀变成

http://127.0.0.1:3000/oauth2/token



Copied!

# 4. 验证码校验处理

pigx-auth 认证中心在接收到网关转发的请求后,会通过 ValidateCodeFilter 对验证码(图形、短信)等进行校验

# 5. 前端请求密文解密

1
2
3
4
5
6
7
8
9
password密文:JFat0Zdc

转成

password明文:123456



Copied!

pigx-auth 在处理完验证码判断逻辑后,PasswordDecoderFilter 针对 /oauth2/token 请求会进行前端密码解密。

# 6. auth 模块详解

登录请求报文

1
2
3
4
5
6
7
8
9
10
POST /auth/oauth2/token?grant_type=password&scope=server HTTP/1.1
Host: pig-gateway:9999
Authorization: Basic dGVzdDp0ZXN0
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
username=admin&password=YehdBPev



Copied!

# ① 客户端认证

如上图在登录请求中会携带 Basic base64(clientId:clientSecret), 那么首先 OAuth2ClientAuthenticationFilter 会通过调用 RegisteredClientRepository (数据库存储) 来判断传入的客户端是否正确

# ② 正式接收登录请求

OAuth2TokenEndpointFilter 会接收通过上文 OAuth2ClientAuthenticationFilter 客户端认证的请求

# ③ 组装认证对象

AuthenticationConverter 会根据请求中的参数和授权类型组装成对应的授权认证对象

# ④ 登录认证对象

AuthenticationToken

1
2
3
4
5
6
7
8
public class XXXAuthenticationToken extends OAuth2ResourceOwnerBaseAuthenticationToken {

}




Copied!

# ⑤ 授权认证调用

# ⑥ 核心认证逻辑

# 多用户体系匹配 UserDetailsService

# 密码匹配校验

# 用户状态校验

# ⑦ 用户查询逻辑

用户查询逻辑的多种实现形式

  • 解耦: 通过 feign 查询其他系统获取并组装成 UserDetails
  • 简单: 认证中心直接查询 DB 并组装成 UserDetails

# ⑧ 密码校验逻辑

1
2
3
4
5
6
7
8
9
10
默认支持加密方式如下:

{noop}密码明文
{加密特征码}密码密文

PasswordEncoder 会自动根据特征码匹配对应的加密算法,所以上一步⑧ 查询用户对象组装成 UserDetails 需要特殊处理



Copied!
1
2
3
4
5
6
return new UserDetails(user.getUsername(),"{bcrypt}"+"数据库存储的密文");




Copied!

# ⑨ 生成 OAuth2AccessToken

# ⑩Token 存储持久化

当前 SAS 仅支持 JDBC 和内存 ,PIGX 扩展支持 Redis 实现

# ⑪ 登录成功事件处理

基于 SpringEvent 事件处理,可以在这里做更多的处理 日志、个性化等处理逻辑

# ⑫ 请求结果输出 Token

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void sendAccessTokenResponse(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException {

OAuth2AccessTokenAuthenticationToken accessTokenAuthentication = (OAuth2AccessTokenAuthenticationToken) authentication;

OAuth2AccessToken accessToken = accessTokenAuthentication.getAccessToken();
OAuth2RefreshToken refreshToken = accessTokenAuthentication.getRefreshToken();
Map<String, Object> additionalParameters = accessTokenAuthentication.getAdditionalParameters();
// 无状态 注意删除 context 上下文的信息
SecurityContextHolder.clearContext();
this.accessTokenHttpResponseConverter.write(accessTokenResponse, null, httpResponse);
}




Copied!

定义具体的输出返回格式等逻辑

📄 数据库字段文档说明 📄 请求校验 token 源码解析

  • 标题: 登录 Token 生成源码解析
  • 作者: PIGCLOUD
  • 创建于 : 2024-01-01 00:00:00
  • 更新于 : 2025-09-22 14:27:28
  • 链接: https://anime-blog.52lin.site/📄 登录 token 生成源码解析 _ PIGCLOUD/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。