Feat: add session
This commit is contained in:
68
models/session.go
Normal file
68
models/session.go
Normal file
@@ -0,0 +1,68 @@
|
||||
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")))
|
||||
}
|
||||
Reference in New Issue
Block a user