package pub import ( "context" "strings" "time" "perms-system-server/internal/consts" authHelper "perms-system-server/internal/logic/auth" "perms-system-server/internal/response" "perms-system-server/internal/svc" "perms-system-server/internal/types" "github.com/zeromicro/go-zero/core/logx" ) type RefreshTokenLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewRefreshTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RefreshTokenLogic { return &RefreshTokenLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *RefreshTokenLogic) RefreshToken(req *types.RefreshTokenReq) (resp *types.LoginResp, err error) { tokenStr := strings.TrimPrefix(req.Authorization, "Bearer ") if tokenStr == "" || tokenStr == req.Authorization { return nil, response.ErrUnauthorized("refreshToken格式错误") } claims, err := authHelper.ParseRefreshToken(tokenStr, l.svcCtx.Config.Auth.RefreshSecret) if err != nil { return nil, response.ErrUnauthorized("refreshToken无效或已过期") } productCode := claims.ProductCode if req.ProductCode != "" && req.ProductCode != productCode { return nil, response.ErrBadRequest("刷新令牌不允许切换产品") } ud := l.svcCtx.UserDetailsLoader.Load(l.ctx, claims.UserId, productCode) if ud.Status != consts.StatusEnabled { return nil, response.ErrForbidden("账号已被冻结") } if productCode != "" && !ud.IsSuperAdmin && ud.MemberType == "" { return nil, response.ErrForbidden("您已不是该产品的成员") } if claims.TokenVersion != ud.TokenVersion { return nil, response.ErrUnauthorized("登录状态已失效,请重新登录") } accessToken, err := authHelper.GenerateAccessToken( l.svcCtx.Config.Auth.AccessSecret, l.svcCtx.Config.Auth.AccessExpire, ud.UserId, ud.Username, ud.ProductCode, ud.MemberType, ud.TokenVersion, ) if err != nil { return nil, err } return &types.LoginResp{ AccessToken: accessToken, RefreshToken: tokenStr, Expires: time.Now().Unix() + l.svcCtx.Config.Auth.AccessExpire, UserInfo: types.UserInfo{ UserId: ud.UserId, Username: ud.Username, Nickname: ud.Nickname, Avatar: ud.Avatar, Email: ud.Email, Phone: ud.Phone, IsSuperAdmin: ud.IsSuperAdminRaw, MustChangePassword: ud.MustChangePwdRaw, MemberType: ud.MemberType, Perms: ud.Perms, }, }, nil }