package auth import ( "errors" "fmt" "net/http" "strings" "time" "github.com/golang-jwt/jwt/v5" ) func createJWT(secret []byte) (token string, err error) { return jwt.NewWithClaims(jwt.SigningMethodHS512, jwt.MapClaims{ "exp": time.Now().Add(time.Hour * 24).Unix(), }).SignedString(secret) } func validateJWT(tokenString string, secret []byte) (err error) { token, err := jwt.Parse(tokenString, func(token *jwt.Token) (any, error) { // Don't forget to validate the alg is what you expect: if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return secret, nil }) if err != nil { return } if date, err := token.Claims.GetExpirationTime(); err == nil && date.After(time.Now()) { return nil } return errors.New("JWT not valid") } func extractToken(r *http.Request) (token string, err error) { tokenHeader := r.Header.Get("Authorization") // Grab the token from the header if tokenHeader == "" { err = errors.New("missing token") return } token = strings.TrimPrefix(tokenHeader, "Bearer ") if token == "" { err = errors.New("malformed token") } return }