authServices.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. zap.L().Error("store session err", zap.String("AccessToken", auth.AccessToken), zap.String("RefreshToken", auth.RefreshToken), zap.String("err", err.Error()))
  23. return nil, fmt.Errorf("store session err: %w", err)
  24. }
  25. return &domain.AuthInfo{
  26. SessionId: sid,
  27. AccessToken: auth.AccessToken,
  28. RefreshToken: auth.RefreshToken,
  29. }, nil
  30. }
  31. // 恢复会话 - 返回AccessToken
  32. func GetSession(sid string) (string, error) {
  33. sess, err := repositories.GetSession(sid)
  34. if err != nil {
  35. return "", errors.New("session not found")
  36. }
  37. at := sess.AccessToken
  38. if !isExpired(at) {
  39. // 证书过期
  40. rt := sess.RefreshToken
  41. if !isExpired(rt) {
  42. // 刷新证书过期,返回空证书
  43. return "", nil
  44. }
  45. // 刷新证书
  46. at, err = RefreshToken(sid)
  47. if err != nil {
  48. return "", err
  49. }
  50. }
  51. return at, nil
  52. }
  53. // 刷新Token - 返回AccessToken
  54. func RefreshToken(sid string) (string, error) {
  55. sess, err := repositories.GetSession(sid)
  56. if err != nil {
  57. return "", errors.New("session not found")
  58. }
  59. rt := sess.RefreshToken
  60. if rt == "" {
  61. return "", errors.New("no refresh token")
  62. }
  63. auth, err := casdoor.RefreshToken(rt)
  64. if err != nil {
  65. return "", err
  66. }
  67. if err := repositories.StoreSession(sid, auth); err != nil {
  68. return "", fmt.Errorf("store session err: %w", err)
  69. }
  70. return auth.AccessToken, nil
  71. }
  72. // 请求登出
  73. func Logout(sid string) error {
  74. if sid != "" {
  75. return repositories.DeleteSession(sid)
  76. }
  77. return nil
  78. }
  79. // 检查证书是否过期
  80. // true - 未过期
  81. // false - 过期
  82. func isExpired(token string) bool {
  83. claims, err := casdoor.ParseJwtToken(token)
  84. if err != nil {
  85. zap.L().Error("ParseJwtToken() error", zap.String("err", err.Error()))
  86. return false
  87. }
  88. if claims.ExpiresAt == nil {
  89. return false // 没有设置过期时间
  90. }
  91. return claims.ExpiresAt.Time.Before(time.Now())
  92. }