Sécurité & règles transverses

mTLS (Mutual TLS)

Toutes les requêtes nécessitent une connexion mTLS, à l'exception du GET /auth. Le TPP présente un certificat eIDAS QWAC valide contenant :

  • le rôle AIS (Account Information Service) — rôle PSD2 PSP_AI dans l'extension X.509 du certificat ;
  • le pays FR.

Le certificat remplace le client_secret : l'authentification du TPP repose entièrement sur sa vérification à chaque appel, conformément à STET.

Signature HTTP (draft-cavage-http-signatures)

Les requêtes avec body (POST, PATCH, PUT) doivent inclure les headers Signature et Digest.

HeaderDescriptionObligatoire
SignatureSignature HTTP draft-cavage. Le keyId doit correspondre à un kid valide du JWKS enregistré.Oui (requêtes avec body)
DigestSHA-256=<base64(sha256(body))> (RFC 3230)Oui (requêtes avec body)

Format strict du header Signature — les 4 paramètres doivent apparaître dans cet ordre exact, séparés par une virgule sans espace, sinon 401 :

Signature: keyId="mykey",algorithm="rsa-sha256",headers="(request-target) host date digest x-request-id",signature="Ef7MlxLX..."

Règles précises :

  • Algorithme : seul rsa-sha256 est accepté (rsa-pss-sha256, hs2019… rejetés).
  • Headers signés : minimum recommandé (request-target) host date digest x-request-id. Tout header listé doit être réellement présent (sinon 401 Required header missing). Ne pas dupliquer un header.
  • Encodage de la signature : base64 standard (A-Z a-z 0-9 + / =), pas base64url.
  • Séparateur de la signing string : \n (LF), pas \r\n (CRLF).

Les réponses de l'API incluent également les headers Digest et Signature (authenticité + intégrité).

Le POST /psd2/register a une particularité : la clé de vérification est résolue via le JWKS présent dans le body (le client n'existe pas encore). Le keyId du header doit donc correspondre à un kid du JWKS envoyé.

Header de corrélation

HeaderDescriptionObligatoire
X-Request-IDUUID de corrélation, retourné dans la réponseNon (recommandé)

Headers PSU (AISP)

Sur les appels AISP, en plus de Authorization: Bearer {access_token}, vous pouvez transmettre des headers PSU (tous optionnels) : PSU-IP-Address, PSU-IP-Port, PSU-HTTP-Method, PSU-Date, PSU-GEO-Location, PSU-User-Agent, PSU-Referer, PSU-Accept, PSU-Accept-Charset, PSU-Accept-Encoding, PSU-Accept-Language, PSU-Device-ID.

Format d'erreur commun

Toutes les erreurs suivent ce format :

json
{
  "statusCode": 400,
  "timestamp": "2021-08-25T10:15:30.000Z",
  "path": "/psd2/aisp/accounts",
  "method": "GET",
  "message": "Bad Request",
  "context": {},
  "errorCode": "core.bad_request",
  "errorLevel": "error"
}
Code HTTPerrorCodeDescription
400core.bad_requestRequête invalide
401core.unauthorizedAuthentification échouée
403core.forbiddenAccès refusé (auth OK, droits insuffisants)
404core.not_foundRessource introuvable
405core.method_not_allowedMéthode HTTP non autorisée
406core.not_acceptable_errorFormat de réponse non acceptable
408core.request_timeout_errorTimeout
429core.too_many_requestsRate limiting
500core.internal_server_errorErreur interne
502EXTERNAL_SERVICE_ERRORService externe indisponible
503core.service_unavailableService indisponible

Tapez pour rechercher dans la documentation et la référence API