diff --git a/serv_golang_rest_api/internal/model/user.go b/serv_golang_rest_api/internal/model/user.go index 075ac39..9aab969 100644 --- a/serv_golang_rest_api/internal/model/user.go +++ b/serv_golang_rest_api/internal/model/user.go @@ -1,37 +1,39 @@ package model import ( - "time" + "time" - "gorm.io/gorm" + "gorm.io/gorm" ) type User struct { - ID uint `json:"id" gorm:"primarykey"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` - DeletedAt gorm.DeletedAt `json:"deleted_at,omitempty" gorm:"index"` - - Name string `json:"name" gorm:"size:100;not null"` - Email string `json:"email" gorm:"size:255;uniqueIndex;not null"` - Password string `json:"-" gorm:"size:255;not null"` // Пароль не возвращаем в JSON + ID uint `json:"id" gorm:"primarykey"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + DeletedAt gorm.DeletedAt `json:"deleted_at,omitempty" gorm:"index"` + + Name string `json:"name" gorm:"size:100;not null"` + Email string `json:"email" gorm:"size:255;uniqueIndex;not null"` + Password string `json:"-" gorm:"size:255;not null"` // Пароль не возвращаем в JSON + // OAuth провайдеры + OAuthProviders []OAuthProvider `json:"-"` } type CreateUserRequest struct { - Name string `json:"name" validate:"required,min=2,max=100"` - Email string `json:"email" validate:"required,email"` - Password string `json:"password" validate:"required,min=6"` + Name string `json:"name" validate:"required,min=2,max=100"` + Email string `json:"email" validate:"required,email"` + Password string `json:"password" validate:"required,min=6"` } type UpdateUserRequest struct { - Name string `json:"name" validate:"omitempty,min=2,max=100"` - Email string `json:"email" validate:"omitempty,email"` + Name string `json:"name" validate:"omitempty,min=2,max=100"` + Email string `json:"email" validate:"omitempty,email"` } type UserResponse struct { - ID uint `json:"id"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` - Name string `json:"name"` - Email string `json:"email"` -} \ No newline at end of file + ID uint `json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + Name string `json:"name"` + Email string `json:"email"` +} diff --git a/serv_golang_rest_api/internal/utils/jwt.go b/serv_golang_rest_api/internal/utils/jwt.go new file mode 100644 index 0000000..c77479c --- /dev/null +++ b/serv_golang_rest_api/internal/utils/jwt.go @@ -0,0 +1,49 @@ +// utils/jwt.go +package utils + +import ( + "time" + "github.com/golang-jwt/jwt/v4" +) + +var jwtSecret = []byte("your-secret-key") // вынеси в env variables + +type Claims struct { + UserID uint `json:"user_id"` + Email string `json:"email"` + jwt.RegisteredClaims +} + +func GenerateJWT(userID uint, email string) (string, error) { + expirationTime := time.Now().Add(24 * time.Hour) + + claims := &Claims{ + UserID: userID, + Email: email, + RegisteredClaims: jwt.RegisteredClaims{ + ExpiresAt: jwt.NewNumericDate(expirationTime), + IssuedAt: jwt.NewNumericDate(time.Now()), + }, + } + + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + return token.SignedString(jwtSecret) +} + +func ValidateJWT(tokenString string) (*Claims, error) { + claims := &Claims{} + + token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) { + return jwtSecret, nil + }) + + if err != nil { + return nil, err + } + + if !token.Valid { + return nil, jwt.ErrSignatureInvalid + } + + return claims, nil +} \ No newline at end of file