mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-04 19:02:33 -06:00
2801-есть десктоп-версия. реализован ws для авторизации через тг-бота
This commit is contained in:
107
internal/services/auth/service.go
Normal file
107
internal/services/auth/service.go
Normal file
@@ -0,0 +1,107 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"rmser/internal/domain/account"
|
||||
"rmser/internal/transport/ws"
|
||||
"rmser/pkg/logger"
|
||||
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
"github.com/google/uuid"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// Claims представляет JWT claims для токена авторизации
|
||||
type Claims struct {
|
||||
UserID uuid.UUID `json:"user_id"`
|
||||
TelegramID int64 `json:"telegram_id"`
|
||||
jwt.RegisteredClaims
|
||||
}
|
||||
|
||||
// Service представляет сервис авторизации для desktop auth
|
||||
type Service struct {
|
||||
accountRepo account.Repository
|
||||
wsServer *ws.Server
|
||||
secretKey string
|
||||
}
|
||||
|
||||
// NewService создает новый экземпляр сервиса авторизации
|
||||
func NewService(accountRepo account.Repository, wsServer *ws.Server, secretKey string) *Service {
|
||||
return &Service{
|
||||
accountRepo: accountRepo,
|
||||
wsServer: wsServer,
|
||||
secretKey: secretKey,
|
||||
}
|
||||
}
|
||||
|
||||
// InitDesktopAuth генерирует уникальный session_id для desktop авторизации
|
||||
func (s *Service) InitDesktopAuth() (string, error) {
|
||||
sessionID := uuid.New().String()
|
||||
|
||||
logger.Log.Info("Инициализация desktop авторизации",
|
||||
zap.String("session_id", sessionID),
|
||||
)
|
||||
|
||||
return sessionID, nil
|
||||
}
|
||||
|
||||
// ConfirmDesktopAuth подтверждает авторизацию и отправляет токен через Socket.IO
|
||||
func (s *Service) ConfirmDesktopAuth(sessionID string, telegramID int64) error {
|
||||
// Ищем пользователя по Telegram ID
|
||||
user, err := s.accountRepo.GetUserByTelegramID(telegramID)
|
||||
if err != nil {
|
||||
logger.Log.Error("Пользователь не найден",
|
||||
zap.Int64("telegram_id", telegramID),
|
||||
zap.Error(err),
|
||||
)
|
||||
return errors.New("пользователь не найден")
|
||||
}
|
||||
|
||||
// Генерируем JWT токен
|
||||
token, err := s.generateJWTToken(user)
|
||||
if err != nil {
|
||||
logger.Log.Error("Ошибка генерации JWT токена",
|
||||
zap.String("user_id", user.ID.String()),
|
||||
zap.Error(err),
|
||||
)
|
||||
return err
|
||||
}
|
||||
|
||||
// Отправляем токен через WebSocket
|
||||
s.wsServer.SendAuthSuccess(sessionID, token, *user)
|
||||
|
||||
logger.Log.Info("Desktop авторизация подтверждена",
|
||||
zap.String("session_id", sessionID),
|
||||
zap.String("user_id", user.ID.String()),
|
||||
zap.Int64("telegram_id", telegramID),
|
||||
)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// generateJWTToken генерирует JWT токен для пользователя
|
||||
func (s *Service) generateJWTToken(user *account.User) (string, error) {
|
||||
// Создаем claims с данными пользователя
|
||||
claims := Claims{
|
||||
UserID: user.ID,
|
||||
TelegramID: user.TelegramID,
|
||||
RegisteredClaims: jwt.RegisteredClaims{
|
||||
ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), // Токен действителен 24 часа
|
||||
IssuedAt: jwt.NewNumericDate(time.Now()),
|
||||
NotBefore: jwt.NewNumericDate(time.Now()),
|
||||
},
|
||||
}
|
||||
|
||||
// Создаем токен с claims
|
||||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
||||
|
||||
// Подписываем токен секретным ключом
|
||||
tokenString, err := token.SignedString([]byte(s.secretKey))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return tokenString, nil
|
||||
}
|
||||
Reference in New Issue
Block a user