Auth0 pour la FinTech : conformité FCA, PSD2 et authentification forte
Configurez Auth0 pour répondre aux exigences FCA et PSD2 : authentification forte du client (SCA), transaction signing et conformité Open Banking.
Par Auth0.Expert · 2025-07-14 · 12 min de lecture
Auth0 pour la FinTech : FCA, PSD2 et SCA
TL;DR
PSD2 et les réglementations FCA/ACPR imposent la Strong Customer Authentication (SCA) pour les paiements en ligne. Auth0 peut implémenter les exigences SCA avec MFA contextuel, mais doit être complété par une solution de transaction signing dédiée.
Exigences SCA (Strong Customer Authentication)
Ce bloc détaille les trois catégories d’authentification requises par la SCA et indique la couverture native d’Auth0.
PSD2 Article 97 — SCA requiert 2 facteurs parmi :
┌─────────────────────────────────────────────────────┐
│ Possession │ Connaissance │ Inhérence │
│ (have) │ (know) │ (are) │
├─────────────────────────────────────────────────────┤
│ - Téléphone │ - Mot de passe │ - Empreinte │
│ - Token OTP │ - PIN │ - Face ID │
│ - Carte │ - Questions │ - Comportement │
│ - Clé FIDO2 │ secrètes │ biométrique │
└─────────────────────────────────────────────────────┘
Auth0 couvre : Connaissance + Possession/Inhérence via MFA
Manquant dans Auth0 : Transaction signing (montant + bénéficiaire)
Implémentation SCA avec Auth0
Voici une Action Auth0 qui déclenche l'authentification multifacteur contextuelle lors des paiements, pour respecter les seuils PSD2.
// Auth0 Action : SCA contextuelle pour paiements
exports.onExecutePostLogin = async (event, api) => {
const isPaymentApp = event.client.name === "payment-portal";
if (!isPaymentApp) return;
// Extraire le contexte de transaction depuis le state
let transactionContext = null;
try {
const state = JSON.parse(atob(event.request.query?.state || "{}"));
transactionContext = state.transaction;
} catch (e) {}
const mfaUsed = event.authentication?.methods?.some(m => m.name === "mfa");
// SCA obligatoire si :
// - Montant > 30€ (seuil PSD2)
// - Nouveau bénéficiaire
// - Accès depuis nouveau device
const requiresSCA = (
(transactionContext?.amount || 0) > 30 ||
transactionContext?.new_beneficiary === true ||
!isKnownDevice(event)
);
if (requiresSCA && !mfaUsed) {
api.authentication.challengeWithAny([
{ type: "webauthn-roaming" }, // Meilleur pour SCA
{ type: "webauthn-platform" }, // TouchID / FaceID
{ type: "totp" } // OTP app
]);
}
};
function isKnownDevice(event) {
// Vérifier si le device est connu via les métadonnées utilisateur
const knownDevices = event.user.user_metadata?.known_devices || [];
const currentDevice = {
user_agent: event.request.user_agent,
ip_prefix: event.request.ip?.split(".").slice(0, 3).join(".")
};
return knownDevices.some(d =>
d.user_agent === currentDevice.user_agent &&
d.ip_prefix === currentDevice.ip_prefix
);
}
Ce code applique les règles SCA lors de la connexion sur le portail de paiement, selon le montant ou le contexte, et déclenche le MFA approprié.
Transaction Signing (PSD2 compliant)
Cette Action illustre comment rediriger vers un service de signature de transaction, indispensable pour être 100% compliant PSD2.
// Auth0 ne gère pas nativement le transaction signing
// Utiliser une Action pour rediriger vers votre service de signing
exports.onExecutePostLogin = async (event, api) => {
const transaction = getTransactionFromState(event);
if (!transaction) return; // Pas de transaction à signer
// Créer un challenge de transaction
const challenge = {
transaction_id: transaction.id,
amount: transaction.amount,
currency: transaction.currency,
beneficiary: transaction.beneficiary,
iban: transaction.iban,
timestamp: new Date().toISOString()
};
// Signer le challenge avec votre clé privée
const signedChallenge = await signChallenge(challenge, process.env.SIGNING_KEY);
// Rediriger vers votre page de confirmation de transaction
api.redirect.sendUserTo("https://votre-app.com/confirm-transaction", {
query: {
session_token: api.redirect.encodeToken({
expiresInSeconds: 120, // 2 minutes pour confirmer
payload: {
challenge: signedChallenge,
transaction_id: transaction.id
}
})
}
});
};
// Page de confirmation : afficher les détails et demander confirmation MFA
// Puis retourner à Auth0 avec /continue
Cette logique permet de signer chaque transaction et de recueillir la confirmation utilisateur de manière conforme.
Open Banking — FAPI Compliance
Cette section montre comment configurer un client Open Banking conforme FAPI avec Auth0, avec support PKCE et PAR.
// FAPI (Financial-grade API) Profile
// Auth0 supporte PKCE + PAR (Pushed Authorization Requests)
// Client configuration pour FAPI compliance
const fapiClientConfig = {
name: "Open Banking Client",
app_type: "regular_web",
// FAPI Profile requirements
token_endpoint_auth_method: "private_key_jwt", // Pas client_secret_basic
jwt_configuration: {
alg: "RS256",
lifetime_in_seconds: 300, // Token courte durée
scopes_key: "permissions"
},
// PKCE obligatoire
require_pkce: true,
// Restricted response types
grant_types: ["authorization_code", "refresh_token"],
response_types: ["code"] // Pas de token en implicit flow
};
// PAR (Pushed Authorization Request) - FAPI 2.0
// Auth0 supporte via /oauth/par endpoint
const parRequest = await fetch(`https://${AUTH0_DOMAIN}/oauth/par`, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: new URLSearchParams({
client_id: CLIENT_ID,
response_type: "code",
scope: "openid accounts payments",
redirect_uri: REDIRECT_URI,
code_challenge: codeChallenge,
code_challenge_method: "S256",
// Paramètre spécifique Open Banking
acr_values: "urn:openbanking:psd2:sca"
})
});
const { request_uri } = await parRequest.json();
// Utiliser request_uri dans l'authorization request
Ce bloc configure un client conforme au profil FAPI et met en œuvre une requête d’autorisation poussée obligatoire pour la sécurité Open Banking.
Exemptions SCA (Art. 10-18 RTS)
Cette Action montre comment appliquer automatiquement les exemptions prévues par la réglementation et documenter celles-ci.
// Auth0 Action : appliquer les exemptions SCA
exports.onExecutePostLogin = async (event, api) => {
const transaction = getTransaction(event);
if (!transaction) return;
// Exemptions PSD2 / RTS
const exemptions = {
// Art. 16 : Transactions à faible montant (≤ 30€)
low_value: transaction.amount <= 30,
// Art. 18 : Transactions récurrentes même montant
recurring: transaction.is_recurring &&
transaction.amount === transaction.previous_amount,
// Art. 15 : Bénéficiaire de confiance (whitelisté)
trusted_beneficiary: isTrustedBeneficiary(
event.user.user_metadata?.trusted_beneficiaries,
transaction.iban
),
// Art. 17 : Corporate payments (B2B)
corporate: event.user.app_metadata?.account_type === "corporate"
};
const isExempted = Object.values(exemptions).some(Boolean);
if (!isExempted) {
// SCA obligatoire
api.authentication.challengeWithAny([...]);
} else {
// Logger l'exemption utilisée
api.accessToken.setCustomClaim("sca_exemption", {
type: Object.keys(exemptions).find(k => exemptions[k]),
transaction_id: transaction.id
});
}
};
Ce code applique la logique des exemptions SCA et ajoute les informations d’exemption dans le token pour audit.
Checklist conformité FinTech × Auth0
La checklist ci-dessous récapitule les points clés de conformité à valider pour un usage FinTech d’Auth0.
PSD2 / SCA :
✅ MFA obligatoire pour transactions > 30€
✅ WebAuthn (possession + inhérence) pour SCA forte
✅ Gestion des exemptions documentée
✅ Transaction signing (service externe)
✅ Session timeout strict (5-15 min inactivité)
Open Banking / FAPI :
✅ PKCE obligatoire
✅ PAR (Pushed Authorization Requests)
✅ Token courte durée (< 5 min)
✅ mTLS ou private_key_jwt pour clients
FCA / ACPR :
✅ Logging complet des transactions
✅ Rapport incidents < 4h (FCA)
✅ Plan de continuité testé
✅ Senior Manager Function (SMF) designé
Fraude :
✅ Attack Protection activé
✅ Device fingerprinting
✅ Monitoring comportemental
✅ Alertes anomalies en temps réel
Auth0.Expert accompagne les FinTech et institutions financières dans leur mise en conformité PSD2/FCA avec Auth0.
Autres articles
- Auth0 et OAuth 2.0 : architecture complète pour comprendre les flux d'autorisation
- OpenID Connect sur Auth0 : ID Token, UserInfo et discovery endpoint expliqués
- Configurer SAML 2.0 avec Auth0 : guide complet pour l'entreprise
- Migrer des Rules vers les Auth0 Actions : guide pas à pas
- Architecture multi-tenant avec Auth0 : organisations, isolation et bonnes pratiques
- Validation des JWT Auth0 : RS256 vs HS256, JWKS et pièges communs
- Concevoir son architecture de tenants Auth0 : dev, staging, prod
- Configurer un domaine personnalisé Auth0 : login.votredomaine.com étape par étape