OPT-OAU-002Decisión del bancoincoherenciaOAuth2 y tokens

PKCE obligatorio o no

¿Exige PKCE el servidor de autorización?

Las opciones

  • No exigido

    Basta con el código de autorización.

  • Exigido

    code_challenge y code_verifier pasan a ser obligatorios. Método plain por defecto, o S256.

Lado del banco
Si se exige PKCE, rechazar toda petición sin code_challenge. La especificación no impone S256 y mantiene plain como valor por defecto.
Lado del TPP
El protocolo no le dice al TPP si se exige PKCE: hay que consultarlo en la documentación del banco. Preferir S256 cuando el banco lo acepte.
Incoherencia de la spec
La verificación del code_verifier en el token endpoint está redactada sin condición, a diferencia de la de /authorize.

Ficha revisada el 19 de octubre de 2026.

Basado en la especificación STET PSD2 API 1.6.3, con licencia CC BY 3.0 FR.

La ficha tal como está almacenada
{
  "id": "OPT-OAU-002",
  "edition": "1.6.3",
  "chooser": "aspsp",
  "title": {
    "fr": "PKCE exigé ou non",
    "en": "PKCE required or not",
    "es": "PKCE obligatorio o no",
    "pt-br": "PKCE obrigatório ou não"
  },
  "question": {
    "fr": "Le serveur d'autorisation exige-t-il PKCE ?",
    "en": "Does the authorization server require PKCE?",
    "es": "¿Exige PKCE el servidor de autorización?",
    "pt-br": "O servidor de autorização exige PKCE?"
  },
  "options": [
    {
      "label": {
        "fr": "Non exigé",
        "en": "Not required",
        "es": "No exigido",
        "pt-br": "Não exigido"
      },
      "text": {
        "fr": "Le code d'autorisation suffit.",
        "en": "The authorization code is enough.",
        "es": "Basta con el código de autorización.",
        "pt-br": "O código de autorização basta."
      }
    },
    {
      "label": {
        "fr": "Exigé",
        "en": "Required",
        "es": "Exigido",
        "pt-br": "Exigido"
      },
      "text": {
        "fr": "`code_challenge` et `code_verifier` deviennent obligatoires. Méthode `plain` par défaut, ou `S256`.",
        "en": "`code_challenge` and `code_verifier` become mandatory. The method is `plain` by default, or `S256`.",
        "es": "`code_challenge` y `code_verifier` pasan a ser obligatorios. Método `plain` por defecto, o `S256`.",
        "pt-br": "`code_challenge` e `code_verifier` passam a ser obrigatórios. Método `plain` por padrão, ou `S256`."
      }
    }
  ],
  "stet": {
    "sections": [
      {
        "part": "framework",
        "section": "3.4.2.3",
        "page": 25
      }
    ],
    "openapi": [],
    "flows": [],
    "changes": [],
    "remark": null
  },
  "aspsp": {
    "fr": "Si PKCE est exigé, refuser une requête sans `code_challenge`. La spec n'impose pas `S256` et garde `plain` comme valeur par défaut.",
    "en": "If PKCE is required, reject a request without `code_challenge`. The spec does not mandate `S256` and keeps `plain` as the default value.",
    "es": "Si se exige PKCE, rechazar toda petición sin `code_challenge`. La especificación no impone `S256` y mantiene `plain` como valor por defecto.",
    "pt-br": "Se PKCE for exigido, recusar uma requisição sem `code_challenge`. A especificação não impõe `S256` e mantém `plain` como valor padrão."
  },
  "tpp": {
    "fr": "Le protocole ne dit pas au TPP si PKCE est exigé, il faut le lire dans la documentation de la banque. Préférer `S256` quand la banque l'accepte.",
    "en": "The protocol does not tell the TPP whether PKCE is required. Check the bank's documentation. Prefer `S256` when the bank accepts it.",
    "es": "El protocolo no le dice al TPP si se exige PKCE: hay que consultarlo en la documentación del banco. Preferir `S256` cuando el banco lo acepte.",
    "pt-br": "O protocolo não diz ao TPP se PKCE é exigido. É preciso ver isso na documentação do banco. Preferir `S256` quando o banco aceitar."
  },
  "regulation": null,
  "note": {
    "fr": "La vérification du `code_verifier` au token endpoint est écrite sans condition, contrairement à celle de `/authorize`.",
    "en": "The `code_verifier` check at the token endpoint is written without a condition, unlike the one at `/authorize`.",
    "es": "La verificación del `code_verifier` en el token endpoint está redactada sin condición, a diferencia de la de `/authorize`.",
    "pt-br": "A verificação do `code_verifier` no token endpoint está escrita sem condição, ao contrário da verificação em `/authorize`."
  },
  "production": null,
  "verifiedAt": "2026-10-19"
}