core/auth/tokens.go
2024-05-10 13:17:18 +07:00

77 lines
1.3 KiB
Go

package auth
import (
"context"
"fmt"
"system-trace/core/app/constants"
"system-trace/core/database"
"system-trace/core/database/entities"
"system-trace/core/utils"
"time"
"github.com/golang-jwt/jwt/v5"
)
const (
AccessTokenLifetime int8 = 3
RefreshTokenLifetime int8 = 24
)
func genPair(u *entities.User) (*PairTokens, error) {
at, rt, err := genTokens(u)
err = insertPair(u.ID, at, rt)
if err != nil {
return nil, err
}
p := PairTokens{
AccessToken: at,
RefreshToken: rt,
}
return &p, nil
}
func genTokens(u *entities.User) (string, string, error) {
at, err := genToken(fmt.Sprintf("%d", u.ID), AccessTokenLifetime)
if err != nil {
return "", "", err
}
rt, err := genToken(at, RefreshTokenLifetime)
if err != nil {
return "", "", err
}
return at, rt, nil
}
func genToken(sub string, hours int8) (string, error) {
fmt.Println(sub, hours)
c := jwt.MapClaims{
"iss": constants.JWT_APP_ISS,
"sub": sub,
"iat": time.Now().Unix(),
"exp": time.Now().Add(time.Duration(hours) * time.Hour).Unix(),
}
a, err := utils.SignJWT(c)
return a, err
}
func insertPair(id int32, at, rt string) error {
aut := entities.AuthToken{
UserID: id,
AccessToken: at,
RefreshToken: rt,
}
ctx := context.Background()
_, err := database.PG.NewInsert().
Model(&aut).
Exec(ctx)
return err
}