77 lines
1.3 KiB
Go
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
|
|
}
|