mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-02-28 13:13:00 +00:00
add auth.go
This commit is contained in:
parent
98231d2131
commit
7cfa516dc4
1 changed files with 69 additions and 0 deletions
|
|
@ -0,0 +1,69 @@
|
|||
package service
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
|
||||
"github.com/mhsanaei/3x-ui/v2/database"
|
||||
"github.com/mhsanaei/3x-ui/v2/database/model"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type AuthService struct {
|
||||
DB *gorm.DB
|
||||
JWTSecret []byte
|
||||
}
|
||||
|
||||
func NewAuthService() *AuthService {
|
||||
secret := os.Getenv("JWT_SECRET")
|
||||
if secret == "" {
|
||||
secret = "dev-secret-change-me"
|
||||
}
|
||||
return &AuthService{
|
||||
DB: database.GetDB(),
|
||||
JWTSecret: []byte(secret),
|
||||
}
|
||||
}
|
||||
|
||||
// Регистрация (используем существующую модель: Username + PasswordHash + Role)
|
||||
func (s *AuthService) Register(username, rawPassword, role string) error {
|
||||
if role == "" {
|
||||
role = "reader"
|
||||
}
|
||||
hash, err := bcrypt.GenerateFromPassword([]byte(rawPassword), 12)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u := &model.User{
|
||||
Username: username,
|
||||
PasswordHash: string(hash),
|
||||
Role: role,
|
||||
}
|
||||
return s.DB.Create(u).Error
|
||||
}
|
||||
|
||||
func (s *AuthService) Login(username, rawPassword string) (string, *model.User, error) {
|
||||
var u model.User
|
||||
if err := s.DB.Where("username = ?", username).First(&u).Error; err != nil {
|
||||
if database.IsNotFound(err) {
|
||||
return "", nil, errors.New("user not found")
|
||||
}
|
||||
return "", nil, err
|
||||
}
|
||||
if err := bcrypt.CompareHashAndPassword([]byte(u.PasswordHash), []byte(rawPassword)); err != nil {
|
||||
return "", nil, errors.New("invalid password")
|
||||
}
|
||||
|
||||
claims := jwt.MapClaims{
|
||||
"id": u.Id,
|
||||
"username": u.Username,
|
||||
"role": u.Role,
|
||||
"exp": time.Now().Add(72 * time.Hour).Unix(),
|
||||
}
|
||||
tok, err := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString(s.JWTSecret)
|
||||
return tok, &u, err
|
||||
}
|
||||
Loading…
Reference in a new issue