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"))) }