55 lines
1.0 KiB
Go
55 lines
1.0 KiB
Go
package auth
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/golang-jwt/jwt/v5"
|
|
)
|
|
|
|
var signingkey []byte
|
|
|
|
type JWTClaims struct {
|
|
User string `json:"user"`
|
|
jwt.RegisteredClaims
|
|
}
|
|
|
|
func SetSigningKey(key string) {
|
|
signingkey = []byte(key)
|
|
}
|
|
|
|
func NewJWT(user string) (string, error) {
|
|
claims := JWTClaims{
|
|
user,
|
|
jwt.RegisteredClaims{
|
|
ExpiresAt: jwt.NewNumericDate(time.Now().Add(15 * time.Minute)), // Expires in 24 hours
|
|
IssuedAt: jwt.NewNumericDate(time.Now()),
|
|
Issuer: "outfit-voting-abi26",
|
|
},
|
|
}
|
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|
|
|
return token.SignedString(signingkey)
|
|
}
|
|
|
|
func ValidateJWT(token string) (string, error) {
|
|
claims := &JWTClaims{}
|
|
parsed, err := jwt.ParseWithClaims(token, claims, func(t *jwt.Token) (any, error) {
|
|
if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
|
|
return nil, jwt.ErrSignatureInvalid
|
|
}
|
|
return signingkey, nil
|
|
})
|
|
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
claims, ok := parsed.Claims.(*JWTClaims)
|
|
|
|
if !ok {
|
|
return "", jwt.ErrTokenInvalidClaims
|
|
}
|
|
|
|
return claims.User, nil
|
|
}
|