package services import ( "errors" "fmt" "fwh-toolbox-server/domain" "fwh-toolbox-server/dto" "fwh-toolbox-server/repositories" "fwh-toolbox-server/utils/casdoor" "time" "github.com/google/uuid" "go.uber.org/zap" ) // 请求登录 func Login(param dto.LoginParam) (*domain.AuthInfo, error) { auth, err := casdoor.Signin(param.Code, param.State) if err != nil { return nil, err } // 生成 sid 并存 Redis(只存 refresh_token,access_token 可以缓存) sid := uuid.NewString() if err := repositories.StoreSession(sid, auth); err != nil { return nil, fmt.Errorf("store session err: %w", err) } return &domain.AuthInfo{ SessionId: sid, AccessToken: auth.AccessToken, RefreshToken: auth.RefreshToken, }, nil } // 恢复会话 - 返回AccessToken func GetSession(sid string) (string, error) { sess, err := repositories.GetSession(sid) if err != nil { return "", errors.New("session not found") } at := sess.AccessToken if !isExpired(at) { // 证书过期 rt := sess.RefreshToken if !isExpired(rt) { // 刷新证书过期,返回空证书 return "", nil } // 刷新证书 at, err = RefreshToken(sid) if err != nil { return "", err } } return at, nil } // 刷新Token - 返回AccessToken func RefreshToken(sid string) (string, error) { sess, err := repositories.GetSession(sid) if err != nil { return "", errors.New("session not found") } rt := sess.RefreshToken if rt == "" { return "", errors.New("no refresh token") } auth, err := casdoor.RefreshToken(rt) if err != nil { return "", err } if err := repositories.StoreSession(sid, auth); err != nil { return "", fmt.Errorf("store session err: %w", err) } return auth.AccessToken, nil } // 请求登出 func Logout(sid string) error { if sid != "" { return repositories.DeleteSession(sid) } return nil } // 检查证书是否过期 // true - 未过期 // false - 过期 func isExpired(token string) bool { claims, err := casdoor.ParseJwtToken(token) if err != nil { zap.L().Error("ParseJwtToken() error", zap.String("err", err.Error())) return false } if claims.ExpiresAt == nil { return false // 没有设置过期时间 } return claims.ExpiresAt.Time.Before(time.Now()) }