authServices.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package services
  2. import (
  3. "errors"
  4. "fmt"
  5. "fwh-toolbox-server/domain"
  6. "fwh-toolbox-server/dto"
  7. "fwh-toolbox-server/repositories"
  8. "fwh-toolbox-server/utils/casdoor"
  9. "time"
  10. "github.com/google/uuid"
  11. "go.uber.org/zap"
  12. )
  13. // 请求登录
  14. func Login(param dto.LoginParam) (*domain.AuthInfo, error) {
  15. auth, err := casdoor.Signin(param.Code, param.State)
  16. if err != nil {
  17. return nil, err
  18. }
  19. // 生成 sid 并存 Redis(只存 refresh_token,access_token 可以缓存)
  20. sid := uuid.NewString()
  21. if err := repositories.StoreSession(sid, auth); err != nil {
  22. return nil, fmt.Errorf("store session err: %w", err)
  23. }
  24. return &domain.AuthInfo{
  25. SessionId: sid,
  26. AccessToken: auth.AccessToken,
  27. RefreshToken: auth.RefreshToken,
  28. }, nil
  29. }
  30. // 恢复会话 - 返回AccessToken
  31. func GetSession(sid string) (string, error) {
  32. sess, err := repositories.GetSession(sid)
  33. if err != nil {
  34. return "", errors.New("session not found")
  35. }
  36. at := sess.AccessToken
  37. if !isExpired(at) {
  38. // 证书过期
  39. rt := sess.RefreshToken
  40. if !isExpired(rt) {
  41. // 刷新证书过期,返回空证书
  42. return "", nil
  43. }
  44. // 刷新证书
  45. at, err = RefreshToken(sid)
  46. if err != nil {
  47. return "", err
  48. }
  49. }
  50. return at, nil
  51. }
  52. // 刷新Token - 返回AccessToken
  53. func RefreshToken(sid string) (string, error) {
  54. sess, err := repositories.GetSession(sid)
  55. if err != nil {
  56. return "", errors.New("session not found")
  57. }
  58. rt := sess.RefreshToken
  59. if rt == "" {
  60. return "", errors.New("no refresh token")
  61. }
  62. auth, err := casdoor.RefreshToken(rt)
  63. if err != nil {
  64. return "", err
  65. }
  66. if err := repositories.StoreSession(sid, auth); err != nil {
  67. return "", fmt.Errorf("store session err: %w", err)
  68. }
  69. return auth.AccessToken, nil
  70. }
  71. // 请求登出
  72. func Logout(sid string) error {
  73. if sid != "" {
  74. return repositories.DeleteSession(sid)
  75. }
  76. return nil
  77. }
  78. // 检查证书是否过期
  79. // true - 未过期
  80. // false - 过期
  81. func isExpired(token string) bool {
  82. claims, err := casdoor.ParseJwtToken(token)
  83. if err != nil {
  84. zap.L().Error("ParseJwtToken() error", zap.String("err", err.Error()))
  85. return false
  86. }
  87. if claims.ExpiresAt == nil {
  88. return false // 没有设置过期时间
  89. }
  90. return claims.ExpiresAt.Time.Before(time.Now())
  91. }