small fixes
This commit is contained in:
@@ -24,34 +24,28 @@ type AuthService struct {
|
||||
|
||||
// Authenticate проверяет учетные данные и возвращает данные для ответа Yggdrasil.
|
||||
func (s *AuthService) Authenticate(ctx context.Context, req models.AuthenticateRequest) (*models.AuthenticateResponse, error) {
|
||||
// 1. Найти пользователя по имени
|
||||
user, err := s.UserRepo.GetUserByUsername(ctx, req.Username)
|
||||
if err != nil {
|
||||
if errors.Is(err, database.ErrUserNotFound) {
|
||||
return nil, ErrInvalidCredentials
|
||||
}
|
||||
return nil, err // Другая ошибка БД
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 2. Сравнить хеш пароля из БД с паролем из запроса
|
||||
err = bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(req.Password))
|
||||
if err != nil {
|
||||
// Если хеши не совпадают, bcrypt возвращает ошибку
|
||||
return nil, ErrInvalidCredentials
|
||||
}
|
||||
|
||||
// 3. Сгенерировать новый accessToken
|
||||
accessToken := uuid.New().String()
|
||||
|
||||
// 4. Сохранить токен в БД
|
||||
err = s.UserRepo.CreateAccessToken(ctx, user.ID, accessToken, req.ClientToken)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 5. Сформировать ответ согласно спецификации Yggdrasil
|
||||
profile := models.ProfileInfo{
|
||||
ID: strings.ReplaceAll(user.UUID.String(), "-", ""), // UUID без дефисов
|
||||
ID: strings.ReplaceAll(user.UUID.String(), "-", ""),
|
||||
Name: user.Username,
|
||||
}
|
||||
|
||||
@@ -71,26 +65,21 @@ func (s *AuthService) Authenticate(ctx context.Context, req models.AuthenticateR
|
||||
|
||||
// LoginUser проверяет учетные данные и генерирует JWT для веб-сессии.
|
||||
func (s *AuthService) LoginUser(ctx context.Context, req models.LoginRequest) (string, *models.User, error) {
|
||||
// 1. Найти пользователя по логину (username или email)
|
||||
user, err := s.UserRepo.GetUserByLogin(ctx, req.Login)
|
||||
if err != nil {
|
||||
if errors.Is(err, database.ErrUserNotFound) {
|
||||
return "", nil, ErrInvalidCredentials
|
||||
}
|
||||
return "", nil, err // Другая ошибка БД
|
||||
return "", nil, err
|
||||
}
|
||||
|
||||
// 2. Сравнить хеш пароля
|
||||
err = bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(req.Password))
|
||||
if err != nil {
|
||||
return "", nil, ErrInvalidCredentials
|
||||
}
|
||||
|
||||
// 3. Создать JWT
|
||||
// Устанавливаем срок действия токена, например, 72 часа
|
||||
expirationTime := time.Now().Add(72 * time.Hour)
|
||||
|
||||
// Создаем claims (полезная нагрузка токена)
|
||||
claims := &jwt.MapClaims{
|
||||
"exp": expirationTime.Unix(),
|
||||
"iat": time.Now().Unix(),
|
||||
@@ -98,17 +87,14 @@ func (s *AuthService) LoginUser(ctx context.Context, req models.LoginRequest) (s
|
||||
"role": user.Role,
|
||||
}
|
||||
|
||||
// Создаем токен с указанием алгоритма подписи и claims
|
||||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
||||
|
||||
// Подписываем токен нашим секретным ключом
|
||||
jwtSecret := os.Getenv("JWT_SECRET_KEY")
|
||||
tokenString, err := token.SignedString([]byte(jwtSecret))
|
||||
if err != nil {
|
||||
return "", nil, err
|
||||
}
|
||||
|
||||
// Скрываем хеш пароля перед отправкой данных пользователя на клиент
|
||||
user.PasswordHash = ""
|
||||
|
||||
return tokenString, user, nil
|
||||
|
||||
Reference in New Issue
Block a user