authRepo.go 1.5 KB

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