authRepo.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package redis
  2. import (
  3. "context"
  4. "errors"
  5. "fwh-toolbox-server/cache"
  6. "fwh-toolbox-server/domain"
  7. "strconv"
  8. "time"
  9. "go.uber.org/zap"
  10. "golang.org/x/oauth2"
  11. )
  12. var (
  13. authCtx = context.Background()
  14. authKeyPrefix = "fwhtoolbox:session:"
  15. )
  16. type SessionInfo struct {
  17. AccessToken string `json:"access_token"`
  18. RefreshToken string `json:"refresh_token"`
  19. AccessExp int64 `json:"access_exp"`
  20. }
  21. func StoreSession(sid string, token *oauth2.Token) error {
  22. key := authKeyPrefix + sid
  23. exp := time.Now().Add(domain.SessionTTL)
  24. accessExp := time.Now().Add(time.Duration(token.ExpiresIn) * time.Second).Unix()
  25. fields := map[string]interface{}{
  26. "refresh_token": token.RefreshToken,
  27. "access_token": token.AccessToken,
  28. "access_exp": accessExp,
  29. }
  30. if err := cache.HSet(authCtx, key, fields); err != nil {
  31. zap.L().Error("HSet failed", zap.String("key", key), zap.Any("fields", fields), zap.String("err", err.Error()))
  32. return err
  33. }
  34. _, err := cache.ExpireAt(authCtx, key, exp)
  35. return err
  36. }
  37. func GetSession(sid string) (*SessionInfo, error) {
  38. key := authKeyPrefix + sid
  39. res, err := cache.HGetAll(authCtx, key)
  40. if err != nil {
  41. return nil, err
  42. }
  43. if len(res) == 0 {
  44. return nil, errors.New("no session")
  45. }
  46. accessToken := res["access_token"]
  47. refreshToken := res["refresh_token"]
  48. accessExpStr := res["access_exp"]
  49. var accessExp int64
  50. if accessExpStr != "" {
  51. accessExp, err = strconv.ParseInt(accessExpStr, 10, 64)
  52. if err != nil {
  53. return nil, err
  54. }
  55. }
  56. return &SessionInfo{
  57. AccessToken: accessToken,
  58. RefreshToken: refreshToken,
  59. AccessExp: accessExp,
  60. }, nil
  61. }
  62. func DeleteSession(sid string) error {
  63. key := authKeyPrefix + sid
  64. return cache.Delete(authCtx, key)
  65. }