- 新增API端点参考文档,涵盖权限、卡密、订单、商户、监控、限制等模块 - 详细说明Apple卡密充值处理流程,包括提交、查询、回调和轮询接口 - 描述充值订单状态机及生命周期,支持超时重试和状态迁移 - 介绍签名验证、幂等控制及重复卡密防刷单策略 - 增加商户配置管理、历史记录查询和错误处理机制说明 - 提供API使用示例代码及客户端实现指导 - 删除过时的.drone.yml.bak文件,清理无用配置 - 添加.dockerignore忽略指定目录和文件
11 KiB
会话管理
**Referenced Files in This Document** - [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go) - [sysUser_v1_user_login_out.go](file://internal/controller/sysUser/sysUser_v1_user_login_out.go) - [auth.go](file://internal/middleware/auth.go) - [user_token.go](file://utility/token/user_token.go) - [models.go](file://utility/config/models.go) - [sys_user.go](file://internal/service/sys_user.go) - [sys_user.go](file://internal/logic/sys_user/sys_user.go) - [sys_user.go](file://internal/model/sys_user.go) - [sys_user_login.go](file://internal/model/sys_user_login.go)目录
简介
本文档详细阐述了kami_backend系统的会话管理机制,包括用户身份验证、令牌生成与验证、会话控制和安全防护等核心功能。系统采用JWT(JSON Web Token)作为主要的认证机制,结合Redis缓存实现高效的会话管理。会话管理模块主要由认证控制器、令牌服务、认证中间件和用户服务等组件构成,共同保障系统的安全性和可用性。
Section sources
认证流程
系统的用户认证流程遵循标准的JWT认证模式,通过用户名和密码进行身份验证,并生成相应的访问令牌。认证过程包括验证码验证、用户信息查询、密码比对和令牌生成等步骤。
sequenceDiagram
participant Client as "客户端"
participant Controller as "认证控制器"
participant Service as "用户服务"
participant Token as "令牌服务"
Client->>Controller : 提交登录请求(用户名、密码、验证码)
Controller->>Service : 验证验证码
Service-->>Controller : 验证结果
alt 验证失败
Controller-->>Client : 返回验证码错误
else 验证成功
Controller->>Service : 查询用户信息
Service-->>Controller : 返回用户数据
Controller->>Service : 验证密码
Service-->>Controller : 密码验证结果
alt 密码验证失败
Controller-->>Client : 返回用户名或密码错误
else 密码验证成功
Controller->>Token : 生成用户令牌
Token-->>Controller : 返回JWT令牌
Controller-->>Client : 返回登录成功响应(包含令牌)
end
end
Diagram sources
Section sources
令牌管理
令牌生成
系统使用JWT标准生成用户令牌,令牌包含用户ID、用户名、签发时间、过期时间等信息。令牌生成过程由GenerateUserToken函数实现,该函数根据配置的加密密钥对令牌进行签名,并将令牌存储在Redis缓存中以支持令牌失效管理。
flowchart TD
Start([开始]) --> GenerateClaims["生成令牌声明(Claims)"]
GenerateClaims --> SetClaims["设置用户ID、用户名、签发者、过期时间等"]
SetClaims --> SignToken["使用HS256算法签名令牌"]
SignToken --> StoreRedis["将令牌存储到Redis缓存"]
StoreRedis --> ReturnToken["返回JWT令牌"]
ReturnToken --> End([结束])
Diagram sources
令牌验证
令牌验证是会话管理的核心环节,系统通过ParseUserToken函数解析和验证JWT令牌的有效性。验证过程包括检查令牌签名、过期时间以及从Redis中验证令牌是否存在。
flowchart TD
Start([开始]) --> ExtractToken["从请求头提取令牌"]
ExtractToken --> ParseToken["解析JWT令牌"]
ParseToken --> ValidateSignature["验证令牌签名"]
ValidateSignature --> CheckExpired["检查令牌是否过期"]
CheckExpired --> QueryRedis["查询Redis缓存中的令牌"]
QueryRedis --> CompareToken["比较请求令牌与缓存令牌"]
CompareToken --> IsValid{"令牌有效?"}
IsValid --> |是| ReturnSuccess["返回验证成功"]
IsValid --> |否| ReturnFailure["返回验证失败"]
ReturnSuccess --> End([结束])
ReturnFailure --> End
Diagram sources
令牌刷新
系统实现了智能的令牌刷新机制,当令牌的使用时间超过最大刷新时间但未过期时,系统会自动为用户生成新的令牌。这一机制既保证了用户体验的连续性,又增强了系统的安全性。
classDiagram
class UserToken {
+string UserID
+string Username
+RegisteredClaims RegisteredClaims
+genToken(ctx context.Context) string, error
}
class TokenService {
+GenerateUserToken(ctx context.Context, userName, userID string) string, error
+ParseUserToken(ctx context.Context, transToken string) *UserToken, error
+RefreshUserToken(ctx context.Context, userToken UserToken) string, error
+DeleteTokenFromRedis(ctx context.Context, userID string) error
}
class TokenConfig {
+string ServerName
+string CacheKey
+int64 Timeout
+int64 MaxRefresh
+[]byte EncryptKey
+string CacheModel
}
TokenService --> UserToken : "使用"
TokenService --> TokenConfig : "读取配置"
Diagram sources
Section sources
认证中间件
认证中间件是系统安全的第一道防线,负责拦截所有需要认证的请求,验证令牌的有效性,并在必要时进行令牌刷新。中间件还支持白名单机制,允许特定的公共接口无需认证即可访问。
flowchart TD
Start([请求进入]) --> CheckWhiteList["检查是否在白名单"]
CheckWhiteList --> IsWhiteList{"在白名单?"}
IsWhiteList --> |是| PassThrough["直接通过"]
IsWhiteList --> |否| GetToken["从请求获取令牌"]
GetToken --> ValidateToken["验证令牌有效性"]
ValidateToken --> IsValid{"令牌有效?"}
IsValid --> |是| RefreshToken["检查是否需要刷新"]
IsValid --> |否| ReturnError["返回未授权"]
RefreshToken --> NeedRefresh{"需要刷新?"}
NeedRefresh --> |是| GenerateNewToken["生成新令牌"]
NeedRefresh --> |否| Continue["继续处理"]
GenerateNewToken --> SetHeader["设置refresh-token响应头"]
SetHeader --> Continue
Continue --> NextMiddleware["调用下一个中间件"]
ReturnError --> SendResponse["发送错误响应"]
PassThrough --> NextMiddleware
NextMiddleware --> End([处理完成])
SendResponse --> End
Diagram sources
Section sources
用户登出机制
登出流程
用户登出功能通过UserLoginOut控制器实现,当用户发起登出请求时,系统会解析请求中的令牌,提取用户ID,并从Redis缓存中删除对应的令牌,从而实现令牌的立即失效。
sequenceDiagram
participant Client as "客户端"
participant Controller as "登出控制器"
participant Token as "令牌服务"
Client->>Controller : 发送登出请求(包含令牌)
Controller->>Token : 解析用户令牌
Token-->>Controller : 返回用户信息
Controller->>Token : 删除Redis中的令牌
Token-->>Controller : 删除结果
Controller-->>Client : 返回登出成功响应
Diagram sources
会话清理
登出时的会话清理主要通过删除Redis缓存中的令牌来实现。系统使用DeleteTokenFromRedis函数根据用户ID删除对应的令牌记录,确保用户无法再使用旧的令牌进行认证。
Section sources
安全策略
令牌安全存储
系统采用多层安全措施保护令牌的安全:
- 使用HTTPS协议传输令牌,防止中间人攻击
- 令牌存储在Redis缓存中,设置合理的过期时间
- 使用强加密算法(HS256)对令牌进行签名
- 敏感信息不存储在令牌中,仅包含必要的用户标识
过期时间设置
令牌的过期时间通过配置文件进行管理,系统支持灵活的过期策略:
- 基础过期时间:默认10天(可配置)
- 最大刷新时间:默认5天(可配置),超过此时间后令牌不再自动刷新
- 令牌刷新机制:在最大刷新时间和过期时间之间使用时自动刷新
防止令牌劫持
系统通过以下机制防止令牌劫持:
- 令牌绑定用户会话,每次请求都验证令牌与用户的一致性
- 支持令牌立即失效,用户登出后旧令牌无法使用
- 白名单机制限制敏感操作的访问路径
- 请求头验证,确保令牌来源的合法性
Section sources
性能优化
缓存策略
系统采用Redis作为令牌的缓存存储,相比内存存储具有以下优势:
- 支持分布式部署,多实例间共享会话状态
- 数据持久化,重启后会话状态不丢失
- 内置过期机制,自动清理过期令牌
- 高性能读写,满足高并发场景需求
并发处理
认证中间件设计考虑了高并发场景下的性能表现:
- 无状态设计,不依赖服务器本地存储
- 轻量级验证,仅需一次Redis查询即可完成认证
- 支持异步刷新,不影响主请求处理流程
- 白名单机制减少不必要的认证开销
资源管理
系统通过以下方式优化资源使用:
- 合理设置令牌过期时间,平衡安全性和用户体验
- 批量操作优化,减少数据库查询次数
- 连接池管理,有效利用数据库连接资源
- 日志分级,避免过度日志影响性能
Section sources
总结
kami_backend的会话管理系统采用现代化的JWT认证机制,结合Redis缓存实现了高效、安全的用户会话管理。系统具有以下特点:
- 安全性高:采用标准JWT协议,支持令牌刷新和立即失效
- 性能优越:基于Redis的缓存设计,支持高并发访问
- 灵活性好:配置化的过期策略和白名单机制
- 易于维护:清晰的代码结构和模块化设计
该会话管理机制能够有效支持系统的安全需求,为用户提供流畅的认证体验,同时具备良好的扩展性和维护性。