generated from VLADIMIR/template
add jwt to login route
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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
|
||||||
|
|||||||
@@ -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)
|
||||||
// gen tokens (module)
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
// save refresh token?
|
return "", "", errors.New("Не получилось получить доступ")
|
||||||
|
}
|
||||||
return nil // claims?
|
|
||||||
|
refreshToken, err := s.processorJWT.GenerateRefreshToken(user.ID)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return "", "", errors.New("Не получилось получить доступ")
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(accessToken, refreshToken)
|
||||||
|
|
||||||
|
// delete refresh tokens
|
||||||
|
// save new refresh token
|
||||||
|
|
||||||
|
return accessToken, refreshToken, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user