Files
egutierrez eff5771b03 feat: jwt_generate, jwt_validate, password_hash, password_verify
Fase 2 del issue 0010 — auth core:
- jwt_generate/validate: HS256 manual con crypto/hmac + crypto/sha256
- password_hash/verify: wrappers de golang.org/x/crypto/bcrypt (cost 12 default)
- JWT rechaza alg != HS256 para mitigar ataque 'alg=none'
- hmac.Equal para comparacion constant-time de firmas
2026-04-18 17:39:00 +02:00

2.1 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested tests test_file_path file_path
jwt_validate function go infra 1.0.0 impure func JWTValidate(token string, secret string) (JWTClaims, error) Verifica la firma HMAC-SHA256 de un JWT y decodifica sus claims. Rechaza tokens mal formados, con firma invalida o expirados.
jwt
auth
token
hmac
verify
infra
JWTClaims_go_infra
JWTClaims_go_infra
false error_go_core
crypto/hmac
crypto/sha256
encoding/base64
encoding/json
errors
strings
time
name desc
token JWT string en formato header.payload.signature (base64url, sin padding)
name desc
secret clave HMAC usada para firmar el token. Debe coincidir con la usada en JWTGenerate
claims decodificadas si el token es valido; error si firma invalida, expirado o malformado true
valida token generado por JWTGenerate
rechaza firma invalida
rechaza token expirado
rechaza token malformado
rechaza algoritmo distinto de HS256
functions/infra/jwt_validate_test.go functions/infra/jwt_validate.go

Ejemplo

auth := r.Header.Get("Authorization")
token := strings.TrimPrefix(auth, "Bearer ")
claims, err := JWTValidate(token, os.Getenv("JWT_SECRET"))
if err != nil {
    HTTPErrorResponse(w, HTTPError{Status: 401, Code: "invalid_token", Message: err.Error()})
    return
}
userID := claims.Subject
role, _ := claims.Custom["role"].(string)

Notas

Impura — usa time.Now() para comparar contra exp. Usa hmac.Equal para comparacion constant-time de firmas (mitiga timing attacks). Solo acepta alg=HS256 en el header, otros algoritmos se rechazan explicitamente para evitar el ataque "alg=none". Si exp es 0 (no fijado) no se valida expiracion — es responsabilidad del caller asegurar que sus tokens siempre tengan exp fijado. Errores descriptivos con prefijo jwt_validate: para facilitar debugging; en respuestas HTTP conviene mapear todos a un mensaje generico "token invalido" para no filtrar informacion.