用户Session管理
概述
Auth服务提供了用户Session管理功能,主要用于处理用户登录状态和会话信息。
Auth服务同时管理Web端、App端和API端的用户Session。
| API | Websocket API | APP API | WebAPI | |
|---|---|---|---|---|
| 登录凭据 | API Key/Secret | ListenKey | Username/Password | Username/Password |
| 登录凭据生成方式 | 管理员配置 | 用户调用API 接口,API向Auth生成ListenKey | 注册 | 注册 |
| 登录成功后生成的凭据 | UserId(无) | UserId(无) | Token(64 chars) | Cookie(64chars) |
| 登录生成的凭据验证方式 | UserId→Auth→UserId(形式) | ListenKey→Auth→UserId<br />可缓存1分钟 | Token→Auth→UserId内存缓存15秒 | Cookie→Auth→UserId内存缓存15秒 |
| 登录生成的凭据有效期 | 永久 | 1小时 | 7天 | 闲置15分钟踢出24小时失效 |
| 登录ban | 无 | 无 | 4次全渠道?失败禁用24小时登录 | 4次全渠道?失败禁用24小时登录 |
| 互踢策略 | 无 | 无 | 只允许一台设备登录APP | 只允许一台设备登录Web |
| 限流 | API Credit限流 | 无 | APP API内部频率限流 | Web API内部频率限流 |
Token Value 结构
go
var TokenTypeMap = map[auth.TokenType]string{
auth.TokenType_Default: "D",
auth.TokenType_UserId: "U",
auth.TokenType_AppToken: "A",
auth.TokenType_Cookie: "C",
auth.TokenType_ListenKey: "L",
}
type TokenValue struct {
Issuer string `json:"i"`
UserId string `json:"u"`
Token string `json:"t"`
Exp time.Time `json:"x"` // server token expiration
ClientExp time.Time `json:"c"` // client token expiration
}Redis结构
Auth服务使用Redis存储用户Session信息,主要包括以下结构:
- Token:用于验证某一个Token在活性期内。超过活性期的Token将被Redis自动删除。
- 键:
TokenType:Token - 值:
TokenValue - 过期时间:15分钟
- 键:
json
Key:
exchange_auth:C:4rg67Kzdjp51vTHpEGuO97wDe9zswINtJN1AtehWX15_8e7nCrL3Yu4Eszxku7N3
Value:
{
"i": "web",
"u": "USER10184160158096005",
"t": "4rg67Kzdjp51vTHpEGuO97wDe9zswINtJN1AtehWX15_8e7nCrL3Yu4Eszxku7N3",
"x": "2025-02-26T06:52:32.140364935Z",
"c": "2025-02-26T06:52:32.140364935Z"
}- User:用于验证某一个用户的Token是否被覆盖、吊销或过期。
- 键:
UserId - 值:{
TokenType1:TokenValue} - 过期时间:不过期
- 键:
Key:
exchange_auth:USER10184160158096005
Value:
{
"C1": {
"i": "web",
"u": "USER10184160158096005",
"t": "4rg67Kzdjp51vTHpEGuO97wDe9zswINtJN1AtehWX15_8e7nCrL3Yu4Eszxku7N3",
"x": "2025-02-26T06:52:32.140364935Z",
"c": "2025-02-26T06:52:32.140364935Z"
}
}Token验证要求
- Token必须在有效期内(
TokenValue.Exp)。该有效期时间较长 - Token必须在客户端过期时间内(
TokenValue.ClientExp)。该有效期时间较短 - Token必须在Redis中存在(
TokenType:Token) - Token必须在用户的Token列表中(
UserId) - Token的Issuer必须与请求的Issuer匹配(
TokenValue.Issuer) - Token的UserId必须与请求的UserId匹配(
TokenValue.UserId) - Token的类型必须与请求的Token类型匹配(
TokenType) - Token的值必须与请求的Token值匹配(
TokenValue.Token)
Token刷新
- 临近客户端过期时间的访问会刷新Token的客户端过期时间(
TokenValue.ClientExp),并通过Web-API刷新用户的Cookie有效期 - Token的Redis存储时间(15分钟)会被刷新
- Token的过期时间(
TokenValue.Exp)不会被刷新
多端登录互踢
- 用户在Web端登录时,会将之前的Web端登录Token覆盖掉。
- 用户在APP端登录时,会将之前的APP端登录Token覆盖掉。
- 原有的Token条目不会被Redis删除。
- User条目中的Token列表会被更新,覆盖掉之前的Token。
- 可以通过设置User条目中的Token列表来实现多端登录互踢、多端多Session保持等功能。
