package token import ( "errors" "time" "github.com/golang-jwt/jwt/v5" "github.com/google/uuid" ) // Different types of error returned by the VerifyToken function var ( ErrInvalidToken = errors.New("token is invalid") ErrExpiredToken = errors.New("token has expired") ) type Type byte const ( TypeAccessToken = 1 TypeRefreshToken = 2 ) // Payload contains the payload data of the token type Payload struct { ID uuid.UUID `json:"id"` RoleID int `json:"role_id"` Type Type `json:"token_type"` Username string `json:"username"` IssuedAt time.Time `json:"issued_at"` ExpiredAt time.Time `json:"expired_at"` } // NewPayload creates a new token payload with a specific username and duration func NewPayload(uuid uuid.UUID, username string, duration time.Duration, tokenType Type) *Payload { payload := &Payload{ ID: uuid, Type: tokenType, Username: username, IssuedAt: time.Now(), ExpiredAt: time.Now().Add(duration), } return payload } // Valid checks if the token payload is valid or not func (payload *Payload) Valid(tokenType Type) error { if payload.Type != tokenType { return ErrInvalidToken } if time.Now().After(payload.ExpiredAt) { return ErrExpiredToken } return nil } func (payload *Payload) GetExpirationTime() (*jwt.NumericDate, error) { return &jwt.NumericDate{ Time: payload.ExpiredAt, }, nil } func (payload *Payload) GetIssuedAt() (*jwt.NumericDate, error) { return &jwt.NumericDate{ Time: payload.IssuedAt, }, nil } func (payload *Payload) GetNotBefore() (*jwt.NumericDate, error) { return &jwt.NumericDate{ Time: payload.IssuedAt, }, nil } func (payload *Payload) GetIssuer() (string, error) { return "", nil } func (payload *Payload) GetSubject() (string, error) { return "", nil } func (payload *Payload) GetAudience() (jwt.ClaimStrings, error) { return jwt.ClaimStrings{}, nil }