pejhancctv/utils/generateToken.go

73 lines
1.4 KiB
Go

package utils
import (
"app/database"
"app/models"
"fmt"
"net/http"
"os"
"time"
"github.com/golang-jwt/jwt/v5"
"github.com/joho/godotenv"
"github.com/labstack/echo/v4"
)
func GenerateToken(c echo.Context, user models.User) (string, error) {
err := godotenv.Load("./config/.env")
if err != nil {
return "", err
}
secret := os.Getenv("SECRET")
db := database.Db()
isExists, err := CheckUserByID(user.User_id)
if err != nil {
return "", err
}
fmt.Println(isExists)
var jwtRecord models.Jwt
if !isExists {
jwtRecord.User_id = user.User_id
err := db.Create(&jwtRecord).Error
if err != nil {
return "", err
}
} else {
if err = db.Where("user_id = ? ", user.User_id).First(&jwtRecord).Error; err != nil {
return "", err
}
}
var tempJwt models.Jwt
if err = db.Where("user_id = ?", jwtRecord.User_id).First(&tempJwt).Error; err != nil {
return "", err
}
claims := &models.JwtClaims{
Jwt_id: tempJwt.Jwt_id,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour * 168)),
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
sToken, err := token.SignedString([]byte(secret))
if err != nil {
return "", err
}
coockie := new(http.Cookie)
coockie.Name = "authorization"
coockie.Value = sToken
// coockie.HttpOnly = true
// coockie.Secure = true
coockie.Expires = time.Now().Add(time.Hour * 24)
c.SetCookie(coockie)
return sToken, nil
}