package token import ( "fmt" "time" "github.com/aead/chacha20poly1305" "github.com/google/uuid" "github.com/o1egl/paseto" ) // PasetoMaker is a PASETO token maker type PasetoMaker struct { paseto *paseto.V2 symmetricKey []byte } // NewPasetoMaker creates a new PasetoMaker func NewPasetoMaker(symmetricKey string) (Maker, error) { if len(symmetricKey) != chacha20poly1305.KeySize { return nil, fmt.Errorf("invalid key size: must be exactly %d characters", chacha20poly1305.KeySize) } maker := &PasetoMaker{ paseto: paseto.NewV2(), symmetricKey: []byte(symmetricKey), } return maker, nil } // CreateToken creates a new token for a specific username and duration func (maker *PasetoMaker) CreateToken(uuid uuid.UUID, username string, duration time.Duration, tokenType Type) (string, *Payload, error) { payload := NewPayload(uuid, username, duration, tokenType) token, err := maker.paseto.Encrypt(maker.symmetricKey, payload, nil) return token, payload, err } // VerifyToken checks if the token is valid or not func (maker *PasetoMaker) VerifyToken(token string, tokenType Type) (*Payload, error) { payload := &Payload{} err := maker.paseto.Decrypt(token, maker.symmetricKey, payload, nil) if err != nil { return nil, ErrInvalidToken } err = payload.Valid(tokenType) if err != nil { return nil, err } return payload, nil }