---
name: JWTClaims
lang: go
domain: infra
version: "1.0.0"
algebraic: product
definition: |
  type JWTClaims struct {
      Subject   string         `json:"sub"`
      Issuer    string         `json:"iss,omitempty"`
      Audience  string         `json:"aud,omitempty"`
      ExpiresAt int64          `json:"exp"`
      IssuedAt  int64          `json:"iat"`
      Custom    map[string]any `json:"custom,omitempty"`
  }
description: "Claims de un JSON Web Token. Incluye los campos registrados (sub, iss, aud, exp, iat) y un mapa Custom libre para claims de aplicacion como role o email."
tags: [jwt, auth, token, claims, infra]
uses_types: []
file_path: "functions/infra/jwt_claims.go"
---

## Ejemplo

```go
claims := JWTClaims{
    Subject:   "user-123",
    Issuer:    "my-api",
    ExpiresAt: time.Now().Add(24 * time.Hour).Unix(),
    Custom: map[string]any{
        "role":  "admin",
        "email": "alice@example.com",
    },
}
token, _ := JWTGenerate(claims, secret)
```

## Notas

Tipo producto — los campos estandar cubren RFC 7519. ExpiresAt y IssuedAt son Unix epoch seconds. JWTGenerate setea IssuedAt automaticamente si viene en cero. Custom se serializa bajo la clave "custom" en el payload JSON para evitar colisiones con claims registrados. Para leer valores custom de forma segura tras JWTValidate: `v, ok := claims.Custom["role"].(string)`.
