Skip to content

用户Session管理

概述

Auth服务提供了用户Session管理功能,主要用于处理用户登录状态和会话信息。

Auth服务同时管理Web端、App端和API端的用户Session。

APIWebsocket APIAPP APIWebAPI
登录凭据API Key/SecretListenKeyUsername/PasswordUsername/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小时失效
登录ban4次全渠道?失败禁用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保持等功能。

🚀 构建现代化数字资产交易平台