2801-есть десктоп-версия. реализован ws для авторизации через тг-бота

This commit is contained in:
2026-01-28 08:12:41 +03:00
parent a536b3ff3c
commit b99e328d35
26 changed files with 2258 additions and 82 deletions

View 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
}