From 19dfc4e91141e688e5ea2875f18ca540e5a82815 Mon Sep 17 00:00:00 2001 From: Fedorov Vladimir Date: Sat, 4 Jul 2026 13:09:39 +0700 Subject: [PATCH] add jwt to login route --- cmd/evening_detective_server/main.go | 4 ++- internal/app/server.go | 7 +++-- internal/modules/processor_jwt/processor.go | 6 ++-- internal/repos/user.go | 2 +- internal/services/users_service/service.go | 31 ++++++++++++++++----- 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/cmd/evening_detective_server/main.go b/cmd/evening_detective_server/main.go index 273c78e..02bf352 100644 --- a/cmd/evening_detective_server/main.go +++ b/cmd/evening_detective_server/main.go @@ -6,6 +6,7 @@ import ( "evening_detective_server/internal/app" "evening_detective_server/internal/modules/email_sender" "evening_detective_server/internal/modules/password_generator" + "evening_detective_server/internal/modules/processor_jwt" "evening_detective_server/internal/repos/users_repo" "evening_detective_server/internal/services/users_service" proto "evening_detective_server/proto" @@ -49,7 +50,8 @@ func main() { smtpUser := os.Getenv("SMTP_USER") smtpPassword := os.Getenv("SMTP_PASSWORD") emailSender := email_sender.NewSender(smtpHost, smtpPort, smtpUser, smtpPassword) - usersService := users_service.NewUsersService(usersRepo, passwordGenerator, emailSender) + processorJWT := processor_jwt.NewProcessor(os.Getenv("SECRET")) + usersService := users_service.NewUsersService(usersRepo, passwordGenerator, emailSender, processorJWT) // Create a listener on TCP port lis, err := net.Listen("tcp", ":8080") diff --git a/internal/app/server.go b/internal/app/server.go index 90c27ab..03a7982 100644 --- a/internal/app/server.go +++ b/internal/app/server.go @@ -49,11 +49,14 @@ func (s *server) RefreshPassword(ctx context.Context, req *proto.RefreshPassword } func (s *server) Login(ctx context.Context, req *proto.LoginReq) (*proto.LoginRsp, error) { - err := s.usersService.Login(ctx, req.Email, req.Password) + accessToken, refreshToken, err := s.usersService.Login(ctx, req.Email, req.Password) if err != nil { return &proto.LoginRsp{ Error: err.Error(), }, nil } - return &proto.LoginRsp{}, nil + return &proto.LoginRsp{ + AccessToken: accessToken, + RefreshToken: refreshToken, + }, nil } diff --git a/internal/modules/processor_jwt/processor.go b/internal/modules/processor_jwt/processor.go index 00a37ec..01d3514 100644 --- a/internal/modules/processor_jwt/processor.go +++ b/internal/modules/processor_jwt/processor.go @@ -32,7 +32,7 @@ func (p *processor) GenerateAccessToken(userId int, userEmail string, userRoles } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) - return token.SignedString(p.secret) + return token.SignedString([]byte(p.secret)) } func (p *processor) GenerateRefreshToken(userId int) (string, error) { @@ -48,14 +48,14 @@ func (p *processor) GenerateRefreshToken(userId int) (string, error) { } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) - return token.SignedString(p.secret) + return token.SignedString([]byte(p.secret)) } func (p *processor) GetClaims(token string) (*JWTClaims, error) { tokenWithClaims, err := jwt.ParseWithClaims( token, &JWTClaims{}, - func(token *jwt.Token) (interface{}, error) { + func(token *jwt.Token) (any, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, errors.New("unexpected signing method") } diff --git a/internal/repos/user.go b/internal/repos/user.go index a3cbf82..9743fc9 100644 --- a/internal/repos/user.go +++ b/internal/repos/user.go @@ -1,7 +1,7 @@ package repos type User struct { - ID string + ID int Username string Email string PasswordHash string diff --git a/internal/services/users_service/service.go b/internal/services/users_service/service.go index cabcf9e..add440e 100644 --- a/internal/services/users_service/service.go +++ b/internal/services/users_service/service.go @@ -5,8 +5,10 @@ import ( "errors" "evening_detective_server/internal/modules/email_sender" "evening_detective_server/internal/modules/password_generator" + "evening_detective_server/internal/modules/processor_jwt" "evening_detective_server/internal/repos/users_repo" "fmt" + "strings" "golang.org/x/crypto/bcrypt" ) @@ -15,17 +17,20 @@ type UsersService struct { usersRepo *users_repo.UsersRepo passwordGenerator password_generator.IPasswordGenerator emailSender email_sender.IEmailSender + processorJWT processor_jwt.IProcessorJWT } func NewUsersService( usersRepo *users_repo.UsersRepo, passwordGenerator password_generator.IPasswordGenerator, emailSender email_sender.IEmailSender, + processorJWT processor_jwt.IProcessorJWT, ) *UsersService { return &UsersService{ usersRepo: usersRepo, passwordGenerator: passwordGenerator, emailSender: emailSender, + processorJWT: processorJWT, } } @@ -97,24 +102,36 @@ func (s *UsersService) Login( ctx context.Context, email string, password string, -) error { +) (string, string, error) { user, err := s.usersRepo.GetUserByEmail( ctx, email, ) if err != nil { - return err + return "", "", err } if err = bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(password)); err != nil { - return errors.New("Не верен email или пароль") + return "", "", errors.New("Не верен email или пароль") } - fmt.Println(user, err) + roles := strings.Split(user.Role, " ") + accessToken, err := s.processorJWT.GenerateAccessToken(user.ID, user.Email, roles) + if err != nil { + fmt.Println(err) + return "", "", errors.New("Не получилось получить доступ") + } - // gen tokens (module) + refreshToken, err := s.processorJWT.GenerateRefreshToken(user.ID) + if err != nil { + fmt.Println(err) + return "", "", errors.New("Не получилось получить доступ") + } - // save refresh token? + fmt.Println(accessToken, refreshToken) - return nil // claims? + // delete refresh tokens + // save new refresh token + + return accessToken, refreshToken, nil }