From 13010ec1a49eb3e3b14b0c4d902685062cafa603 Mon Sep 17 00:00:00 2001 From: Yavolte Date: Tue, 22 Jul 2025 19:05:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=88=B7=E6=96=B0token?= =?UTF-8?q?=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- service/auth.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/service/auth.go b/service/auth.go index 913f9ea..4a8bfe8 100644 --- a/service/auth.go +++ b/service/auth.go @@ -152,7 +152,15 @@ func (s *AuthService) Login(ctx context.Context, req *pb.LoginRequest) (res *pb. IssuedAt: time.Now().Unix(), ExpirationAt: time.Now().Add(time.Second * time.Duration(s.opts.ttl)).Unix(), } + refreshClaims := types.Claims{ + Uid: model.Uid, + Role: model.Role, + Admin: model.Admin, + IssuedAt: time.Now().Unix(), + ExpirationAt: time.Now().Add(time.Hour * 48).Unix(), + } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + refreshToken := jwt.NewWithClaims(jwt.SigningMethodHS256, refreshClaims) res = &pb.LoginResponse{} if res.Token, err = token.SignedString(s.opts.secret); err == nil { @@ -160,6 +168,7 @@ func (s *AuthService) Login(ctx context.Context, req *pb.LoginRequest) (res *pb. res.Username = model.Username res.Expires = s.opts.ttl } + res.RefreshToken, err = refreshToken.SignedString(s.opts.secret) loginModel := &models.Login{} loginModel.Uid = model.Uid loginModel.AccessToken = res.Token @@ -186,6 +195,36 @@ func (s *AuthService) Logout(ctx context.Context, req *pb.LogoutRequest) (res *p return } +func (s *AuthService) RefreshToken(ctx context.Context, req *pb.RefreshTokenRequest) (res *pb.RefreshTokenResponse, err error) { + var ( + token *jwt.Token + ) + if token, err = jwt.ParseWithClaims(req.RefreshToken, &types.Claims{}, func(token *jwt.Token) (interface{}, error) { + return s.opts.secret, nil + }); err != nil { + return + } + if claims, ok := token.Claims.(*types.Claims); ok { + tokenClaims := types.Claims{ + Uid: claims.Uid, + Role: claims.Role, + Admin: claims.Admin, + IssuedAt: time.Now().Unix(), + ExpirationAt: time.Now().Add(time.Second * time.Duration(s.opts.ttl)).Unix(), + } + token := jwt.NewWithClaims(jwt.SigningMethodHS256, tokenClaims) + res = &pb.RefreshTokenResponse{} + if res.Token, err = token.SignedString(s.opts.secret); err == nil { + res.Uid = claims.Uid + res.Expires = s.opts.ttl + return + } + } else { + err = errors.ErrIncompatible + } + return +} + func NewAuthService(cbs ...AuthOption) *AuthService { opts := &authOptions{ ttl: 7200,