60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package jwt
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/lestrrat-go/jwx/v3/jwa"
|
|
"github.com/lestrrat-go/jwx/v3/jwt"
|
|
)
|
|
|
|
type JWT struct {
|
|
secret []byte
|
|
accessTokenTTL time.Duration
|
|
}
|
|
|
|
func New(secret string) *JWT {
|
|
return &JWT{
|
|
secret: []byte(secret),
|
|
accessTokenTTL: 15 * time.Minute,
|
|
}
|
|
}
|
|
|
|
func (j *JWT) GenerateAccessToken(userID, email string) (string, error) {
|
|
tok, err := jwt.NewBuilder().
|
|
Subject(userID).
|
|
IssuedAt(time.Now()).
|
|
Expiration(time.Now().Add(j.accessTokenTTL)).
|
|
Claim("type", "access").
|
|
Claim("email", email).
|
|
Build()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
signed, err := jwt.Sign(tok, jwt.WithKey(jwa.HS256(), j.secret))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return string(signed), nil
|
|
}
|
|
|
|
func (j *JWT) ValidateAccessToken(tokenStr string) (string, error) {
|
|
tok, err := jwt.Parse(
|
|
[]byte(tokenStr),
|
|
jwt.WithKey(jwa.HS256(), j.secret),
|
|
jwt.WithValidate(true),
|
|
)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
subject, ok := tok.Subject()
|
|
if !ok {
|
|
return "", errors.New("token does not contain subject")
|
|
}
|
|
|
|
return subject, nil
|
|
}
|