token.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package auth
  2. import (
  3. "authService/cache"
  4. "authService/model"
  5. "authService/response"
  6. "authService/util"
  7. "authService/validators"
  8. "encoding/json"
  9. "errors"
  10. "fmt"
  11. "os"
  12. "time"
  13. "github.com/go-redis/redis/v8"
  14. )
  15. var expireIn int = 86400 * 14
  16. // 获取授权Token的Redis键名
  17. func getAuthTokenStr(token string) string {
  18. authTokenPrefix := os.Getenv("AUTH_TOKEN_PREFIX")
  19. return fmt.Sprintf("%s:Authorize:Token:%s", authTokenPrefix, token)
  20. }
  21. // 获取用户Token的Redis键名
  22. func getUserAuthTokenStr(userId int64) string {
  23. authTokenPrefix := os.Getenv("AUTH_TOKEN_PREFIX")
  24. return fmt.Sprintf("%s:Authorize:User:%d:Token", authTokenPrefix, userId)
  25. }
  26. // 生成Token
  27. func Generate(formatedUser *validators.User) (string, int, *response.ErrCode) {
  28. token := util.RandString(30)
  29. expire := time.Duration(expireIn) * time.Second
  30. cacheAuthUser := &validators.AuthUser{
  31. ID: formatedUser.ID,
  32. Account: formatedUser.Account,
  33. Nickname: formatedUser.Nickname,
  34. FullPermission: formatedUser.IsSuper == model.UserIsSuperTrue,
  35. RoleIds: formatedUser.RoleIds,
  36. Permissions: formatedUser.Permissions,
  37. LoginAt: time.Now().Unix(),
  38. }
  39. cacheKey := getAuthTokenStr(token)
  40. cacheErr := cache.Instance().Put(cacheKey, cacheAuthUser, expire)
  41. if cacheErr != nil {
  42. return token, expireIn, response.Err
  43. }
  44. userCacheKey := getUserAuthTokenStr(cacheAuthUser.ID)
  45. // 这个key是缓存 服务人员ID 对应的token是什么,到时候用户如果被禁用了,要强制下线
  46. cacheErr = cache.Instance().PutStr(userCacheKey, token, expire)
  47. if cacheErr != nil {
  48. return token, expireIn, response.Err
  49. }
  50. return token, expireIn, nil
  51. }
  52. // 刷新Token
  53. func Refresh(formatedUser *validators.User) (string, int, *response.ErrCode) {
  54. token, err := GetTokenByUserId(formatedUser.ID)
  55. if err != nil {
  56. return "", 0, err
  57. }
  58. if token == "" {
  59. return "", 0, nil
  60. }
  61. expire := time.Duration(expireIn) * time.Second
  62. cacheKey := getAuthTokenStr(token)
  63. cacheAuthUser := &validators.AuthUser{
  64. ID: formatedUser.ID,
  65. Account: formatedUser.Account,
  66. Nickname: formatedUser.Nickname,
  67. FullPermission: formatedUser.IsSuper == model.UserIsSuperTrue,
  68. RoleIds: formatedUser.RoleIds,
  69. Permissions: formatedUser.Permissions,
  70. LoginAt: time.Now().Unix(),
  71. }
  72. cacheErr := cache.Instance().Put(cacheKey, cacheAuthUser, expire)
  73. if cacheErr != nil {
  74. return token, int(expireIn), response.Err
  75. }
  76. return token, int(expireIn), nil
  77. }
  78. // 退出登录
  79. func Exit(userId int64) {
  80. token, _ := GetTokenByUserId(userId)
  81. if token != "" {
  82. userCacheKey := getUserAuthTokenStr(userId)
  83. cacheKey := getAuthTokenStr(token)
  84. cache.Instance().Delete(userCacheKey)
  85. cache.Instance().Delete(cacheKey)
  86. }
  87. }
  88. // 获取某个用户的Token
  89. func GetTokenByUserId(userId int64) (string, *response.ErrCode) {
  90. userCacheKey := getUserAuthTokenStr(userId)
  91. token, err := cache.Instance().Get(userCacheKey)
  92. if err != nil {
  93. if errors.Is(err, redis.Nil) {
  94. return "", nil
  95. }
  96. return "", response.Err
  97. }
  98. return token, nil
  99. }
  100. // 根据Token获取用户信息
  101. func Get(token string) (*validators.AuthUser, *response.ErrCode) {
  102. // 检查token是否存在
  103. cacheKey := getAuthTokenStr(token)
  104. userInfoJson, err := cache.Instance().Get(cacheKey)
  105. if err != nil {
  106. if errors.Is(err, redis.Nil) {
  107. return nil, response.ErrAuthorizationExpired
  108. }
  109. return nil, response.Err
  110. }
  111. var currentUser validators.AuthUser
  112. err = json.Unmarshal([]byte(userInfoJson), &currentUser)
  113. if err != nil {
  114. return nil, response.Err
  115. }
  116. return &currentUser, nil
  117. }