OPT-OAU-002Bank's choiceinconsistencyOAuth2 and tokens

PKCE required or not

Does the authorization server require PKCE?

The options

  • Not required

    The authorization code is enough.

  • Required

    code_challenge and code_verifier become mandatory. The method is plain by default, or S256.

Bank side
If PKCE is required, reject a request without code_challenge. The spec does not mandate S256 and keeps plain as the default value.
TPP side
The protocol does not tell the TPP whether PKCE is required. Check the bank's documentation. Prefer S256 when the bank accepts it.
Spec inconsistency
The code_verifier check at the token endpoint is written without a condition, unlike the one at /authorize.

Entry checked on October 19, 2026.

Based on the STET PSD2 API 1.6.3 specification, licensed CC BY 3.0 FR.

The entry as stored
{
  "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"
}