add jwt to login route

This commit is contained in:
2026-07-04 13:09:39 +07:00
parent 4e5d5bd09e
commit 19dfc4e911
5 changed files with 36 additions and 14 deletions
+3 -1
View File
@@ -6,6 +6,7 @@ import (
"evening_detective_server/internal/app" "evening_detective_server/internal/app"
"evening_detective_server/internal/modules/email_sender" "evening_detective_server/internal/modules/email_sender"
"evening_detective_server/internal/modules/password_generator" "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/repos/users_repo"
"evening_detective_server/internal/services/users_service" "evening_detective_server/internal/services/users_service"
proto "evening_detective_server/proto" proto "evening_detective_server/proto"
@@ -49,7 +50,8 @@ func main() {
smtpUser := os.Getenv("SMTP_USER") smtpUser := os.Getenv("SMTP_USER")
smtpPassword := os.Getenv("SMTP_PASSWORD") smtpPassword := os.Getenv("SMTP_PASSWORD")
emailSender := email_sender.NewSender(smtpHost, smtpPort, smtpUser, smtpPassword) 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 // Create a listener on TCP port
lis, err := net.Listen("tcp", ":8080") lis, err := net.Listen("tcp", ":8080")
+5 -2
View File
@@ -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) { 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 { if err != nil {
return &proto.LoginRsp{ return &proto.LoginRsp{
Error: err.Error(), Error: err.Error(),
}, nil }, nil
} }
return &proto.LoginRsp{}, nil return &proto.LoginRsp{
AccessToken: accessToken,
RefreshToken: refreshToken,
}, nil
} }
+3 -3
View File
@@ -32,7 +32,7 @@ func (p *processor) GenerateAccessToken(userId int, userEmail string, userRoles
} }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) 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) { 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) 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) { func (p *processor) GetClaims(token string) (*JWTClaims, error) {
tokenWithClaims, err := jwt.ParseWithClaims( tokenWithClaims, err := jwt.ParseWithClaims(
token, token,
&JWTClaims{}, &JWTClaims{},
func(token *jwt.Token) (interface{}, error) { func(token *jwt.Token) (any, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, errors.New("unexpected signing method") return nil, errors.New("unexpected signing method")
} }
+1 -1
View File
@@ -1,7 +1,7 @@
package repos package repos
type User struct { type User struct {
ID string ID int
Username string Username string
Email string Email string
PasswordHash string PasswordHash string
+24 -7
View File
@@ -5,8 +5,10 @@ import (
"errors" "errors"
"evening_detective_server/internal/modules/email_sender" "evening_detective_server/internal/modules/email_sender"
"evening_detective_server/internal/modules/password_generator" "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/repos/users_repo"
"fmt" "fmt"
"strings"
"golang.org/x/crypto/bcrypt" "golang.org/x/crypto/bcrypt"
) )
@@ -15,17 +17,20 @@ type UsersService struct {
usersRepo *users_repo.UsersRepo usersRepo *users_repo.UsersRepo
passwordGenerator password_generator.IPasswordGenerator passwordGenerator password_generator.IPasswordGenerator
emailSender email_sender.IEmailSender emailSender email_sender.IEmailSender
processorJWT processor_jwt.IProcessorJWT
} }
func NewUsersService( func NewUsersService(
usersRepo *users_repo.UsersRepo, usersRepo *users_repo.UsersRepo,
passwordGenerator password_generator.IPasswordGenerator, passwordGenerator password_generator.IPasswordGenerator,
emailSender email_sender.IEmailSender, emailSender email_sender.IEmailSender,
processorJWT processor_jwt.IProcessorJWT,
) *UsersService { ) *UsersService {
return &UsersService{ return &UsersService{
usersRepo: usersRepo, usersRepo: usersRepo,
passwordGenerator: passwordGenerator, passwordGenerator: passwordGenerator,
emailSender: emailSender, emailSender: emailSender,
processorJWT: processorJWT,
} }
} }
@@ -97,24 +102,36 @@ func (s *UsersService) Login(
ctx context.Context, ctx context.Context,
email string, email string,
password string, password string,
) error { ) (string, string, error) {
user, err := s.usersRepo.GetUserByEmail( user, err := s.usersRepo.GetUserByEmail(
ctx, ctx,
email, email,
) )
if err != nil { if err != nil {
return err return "", "", err
} }
if err = bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(password)); err != nil { 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
} }