54 lines
1.1 KiB
Go
54 lines
1.1 KiB
Go
package token
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/aead/chacha20poly1305"
|
|
"github.com/o1egl/paseto"
|
|
)
|
|
|
|
type PasetoMaker struct {
|
|
paseto *paseto.V2
|
|
symmetricKey []byte
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
func (maker *PasetoMaker) CreateToken(Username string, UserID int, duration time.Duration) (string, *Payload, error) {
|
|
payload, err := NewPayload(Username, UserID, duration)
|
|
if err != nil {
|
|
return "", payload, err
|
|
}
|
|
|
|
token, err := maker.paseto.Encrypt(maker.symmetricKey, payload, nil)
|
|
return token, payload, err
|
|
}
|
|
|
|
func (maker *PasetoMaker) VerifyToken(token string) (*Payload, error) {
|
|
payload := &Payload{}
|
|
|
|
err := maker.paseto.Decrypt(token, maker.symmetricKey, payload, nil)
|
|
if err != nil {
|
|
return nil, ErrInvalidToken
|
|
}
|
|
|
|
err = payload.Valid()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return payload, nil
|
|
}
|