Files
backend/models/session.go

69 lines
1.7 KiB
Go

package models
import (
"time"
"github.com/golang-jwt/jwt/v5"
"github.com/spf13/viper"
"github.com/uptrace/bun"
)
type Session struct {
bun.BaseModel `bun:"table:session"`
UserId string `bun:"user_id,pk"`
LoginToken string `bun:"login_token,unique"`
RefreshToken string `bun:"refresh_token,unique"`
IsValid bool `bun:"is_valid"`
}
type RefreshTokenClaimFields struct {
UserId string `json:"user_id"`
}
type RefreshTokenClaim struct {
jwt.RegisteredClaims
RefreshTokenClaimFields `json:",inline"`
}
type AccessTokenClaimFields struct {
UserId string `json:"user_id"`
}
type AccessTokenClaim struct {
jwt.RegisteredClaims
AccessTokenClaimFields `json:",inline"`
}
func (self *Session) RotateRefreshToken() error {
refreshToken, err :=
jwt.NewWithClaims(jwt.SigningMethodHS256, RefreshTokenClaim{
RefreshTokenClaimFields: RefreshTokenClaimFields{
UserId: self.UserId,
},
RegisteredClaims: jwt.RegisteredClaims{
IssuedAt: &jwt.NumericDate{time.Now()},
ExpiresAt: &jwt.NumericDate{time.Now().Add(time.Duration(
viper.GetInt64("refresh-token-timeout")) * time.Second)},
}}).SignedString([]byte(viper.GetString("refresh-token-secret")))
if err == nil {
self.RefreshToken = refreshToken
}
return err
}
func (self *Session) ToAccessToken() (string, error) {
return jwt.NewWithClaims(jwt.SigningMethodHS256, AccessTokenClaim{
AccessTokenClaimFields: AccessTokenClaimFields{
UserId: self.UserId,
},
RegisteredClaims: jwt.RegisteredClaims{
IssuedAt: &jwt.NumericDate{time.Now()},
ExpiresAt: &jwt.NumericDate{time.Now().Add(time.Duration(
viper.GetInt64("access-token-timeout")) * time.Second)},
}}).SignedString([]byte(viper.GetString("access-token-secret")))
}