Files
mira/backend/internal/auth/tokens.go
Cauê Faleiros 8c7e5fbbe4
All checks were successful
CI / backend (push) Successful in 13m19s
CI / frontend (push) Successful in 11m3s
CI / docker (push) Successful in 1m58s
first commit
2026-06-03 16:31:42 -03:00

71 lines
1.5 KiB
Go

package auth
import (
"errors"
"time"
"github.com/golang-jwt/jwt/v5"
)
type Claims struct {
UserID string `json:"user_id"`
Email string `json:"email"`
Role string `json:"role"`
jwt.RegisteredClaims
}
type TokenService struct {
secret []byte
accessTTL time.Duration
}
func NewTokenService(secret string, accessTTL time.Duration) TokenService {
return TokenService{
secret: []byte(secret),
accessTTL: accessTTL,
}
}
func (s TokenService) IssueAccessToken(userID string, email string, role string) (string, error) {
if len(s.secret) == 0 {
return "", errors.New("jwt secret is not configured")
}
now := time.Now()
claims := Claims{
UserID: userID,
Email: email,
Role: role,
RegisteredClaims: jwt.RegisteredClaims{
Subject: userID,
IssuedAt: jwt.NewNumericDate(now),
ExpiresAt: jwt.NewNumericDate(now.Add(s.accessTTL)),
},
}
return jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString(s.secret)
}
func (s TokenService) ParseAccessToken(tokenValue string) (Claims, error) {
if len(s.secret) == 0 {
return Claims{}, errors.New("jwt secret is not configured")
}
token, err := jwt.ParseWithClaims(tokenValue, &Claims{}, func(token *jwt.Token) (interface{}, error) {
if token.Method != jwt.SigningMethodHS256 {
return nil, errors.New("unexpected signing method")
}
return s.secret, nil
})
if err != nil {
return Claims{}, err
}
claims, ok := token.Claims.(*Claims)
if !ok || !token.Valid {
return Claims{}, errors.New("invalid token")
}
return *claims, nil
}