Added login and logout

This commit is contained in:
Nedim
2023-11-06 11:22:51 +01:00
parent e47336dc8d
commit 367b5d51f2
9 changed files with 359 additions and 11 deletions

View File

@@ -1,11 +1,15 @@
package user
import (
"errors"
"fmt"
"time"
"github.com/golang-jwt/jwt"
"github.com/jinzhu/gorm"
"gitlab.com/pactual1/backend/models"
"gitlab.com/pactual1/backend/shared"
"golang.org/x/crypto/bcrypt"
)
func SaveResetTokenToDB(userID uint, resetToken string) error {
@@ -33,10 +37,82 @@ func GetUserByEmail(email string) (*models.User, error) {
// Query the database for a user with the specified email
if err := shared.GetDb().Where("email = ?", email).First(&user).Error; err != nil {
if gorm.IsRecordNotFoundError(err) {
return nil, nil
return nil, nil
}
return nil, err
return nil, err
}
return &user, nil
}
}
func CheckPassword(hashedPassword, password string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password))
return err == nil
}
func CreateSessionToken(userID uint) (string, error) {
// Generate JWT token
tokenString, err := CreateJWTToken(userID)
if err != nil {
return "", err
}
// Create and save the session token in the database
sessionToken := models.SessionToken{
UserID: userID,
Token: tokenString,
IsActive: true,
}
if result := shared.GetDb().Create(&sessionToken); result.Error != nil {
return "", result.Error
}
return tokenString, nil
}
func ResetLoginAttempts(user models.User) {
user.LoginAttempts = 0
user.IsActive = true
shared.GetDb().Save(&user)
}
func IncrementLoginAttempts(user models.User) {
user.LoginAttempts++
if user.LoginAttempts >= 10 {
user.IsActive = false
}
shared.GetDb().Save(&user)
}
var jwtKey = []byte("MDQsCiJwYWNrZXRWZXJzaW9uIjogMSwKImhhcm")
func CreateJWTToken(userID uint) (string, error) {
expirationTime := time.Now().Add(24 * time.Hour)
claims := &jwt.StandardClaims{
Subject: fmt.Sprint(userID),
ExpiresAt: expirationTime.Unix(),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err := token.SignedString(jwtKey)
if err != nil {
return "", err
}
return tokenString, nil
}
func InvalidateSessionToken(tokenString string) error {
// Find the session token in the database
var sessionToken models.SessionToken
result := shared.GetDb().Where("token = ?", tokenString).First(&sessionToken)
if result.Error != nil {
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
// If token is not found, you may choose to ignore or handle it as an error
return nil // or return result.Error for strict handling
}
return result.Error
}
return shared.GetDb().Delete(&sessionToken).Error
}