69 lines
1.7 KiB
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")))
|
|
}
|