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 PSD2PSP_AIdans 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.
| Header | Description | Obligatoire |
|---|---|---|
Signature | Signature HTTP draft-cavage. Le keyId doit correspondre à un kid valide du JWKS enregistré. | Oui (requêtes avec body) |
Digest | SHA-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-sha256est 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 (sinon401 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/registera une particularité : la clé de vérification est résolue via le JWKS présent dans le body (le client n'existe pas encore). LekeyIddu header doit donc correspondre à unkiddu JWKS envoyé.
Header de corrélation
| Header | Description | Obligatoire |
|---|---|---|
X-Request-ID | UUID de corrélation, retourné dans la réponse | Non (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 :
{
"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 HTTP | errorCode | Description |
|---|---|---|
| 400 | core.bad_request | Requête invalide |
| 401 | core.unauthorized | Authentification échouée |
| 403 | core.forbidden | Accès refusé (auth OK, droits insuffisants) |
| 404 | core.not_found | Ressource introuvable |
| 405 | core.method_not_allowed | Méthode HTTP non autorisée |
| 406 | core.not_acceptable_error | Format de réponse non acceptable |
| 408 | core.request_timeout_error | Timeout |
| 429 | core.too_many_requests | Rate limiting |
| 500 | core.internal_server_error | Erreur interne |
| 502 | EXTERNAL_SERVICE_ERROR | Service externe indisponible |
| 503 | core.service_unavailable | Service indisponible |