Skip to Content

CIBA (Authentification Backchannel)

Le Client Initiated Backchannel Authentication (CIBA) est une extension OpenID Connect qui permet à une application cliente d’initier l’authentification pour le compte d’un utilisateur sans que celui-ci interagisse directement avec le client. L’utilisateur reçoit à la place une notification (via SMS, e-mail ou push) sur un appareil séparé et y approuve ou refuse la demande.

Cas d’usage courants :

  • Un agent de centre d’appels authentifie un client au téléphone en déclenchant une approbation sur l’appareil mobile du client
  • Un terminal de paiement demande l’approbation depuis le téléphone du titulaire du compte avant de traiter une transaction de grande valeur
  • Une application de bureau délègue la connexion au téléphone de l’utilisateur pour une expérience sans mot de passe
  • Un service backend initie une authentification step-up quand une opération sensible est demandée

Comment ça Fonctionne

CIBA dissocie l’appareil d’où part l’authentification de l’appareil sur lequel l’utilisateur fournit son consentement :

  1. Le client envoie une requête d’authentification backchannel à /api/oauth/ciba avec un login_hint (e-mail, numéro de téléphone ou user ID) qui identifie l’utilisateur
  2. Auris valide la requête et envoie une notification à l’utilisateur sur son appareil ou canal enregistré
  3. L’utilisateur voit les détails de la demande (nom de l’application, binding message) et approuve ou refuse
  4. Le client reçoit le résultat via l’un des trois modes : polling, ping (callback) ou push

Modes de Notification

Auris supporte trois modes pour livrer le résultat de l’authentification au client :

ModeFonctionnementIdéal Pour
PollLe client interroge l’endpoint token à intervalles réguliers jusqu’à ce que l’utilisateur répondeIntégrations simples, clients côté serveur
PingAuris envoie une notification à un callback URL pré-enregistré, puis le client échange l’auth request ID contre un tokenArchitectures event-driven
PushAuris livre le token directement à un callback URL pré-enregistréExigences de faible latence

Le mode Poll est le plus simple à implémenter et est recommandé pour la plupart des cas d’usage. Les modes Ping et Push nécessitent un callback URL accessible publiquement et une sécurité webhook appropriée.


Configuration dans la Console

Active CIBA

Dans la Console Auris, va dans Applications et sélectionne ton application. Dans l’onglet Paramètres, active Activer CIBA.

Configure le Mode de Notification

Sélectionne le mode de notification (Poll, Ping ou Push). Pour les modes Ping et Push, fournis un Callback URL où Auris enverra les notifications.

Définis le Canal de Notification

Choisis comment les utilisateurs reçoivent la notification de demande d’authentification :

CanalPrérequis
E-mailL’utilisateur doit avoir une adresse e-mail vérifiée
SMSL’utilisateur doit avoir un numéro de téléphone vérifié. Nécessite la configuration du fournisseur SMS (Twilio).
PushNécessite une intégration custom de notifications push (avancé)

Configure la Durée de la Requête

Définis le temps maximum pendant lequel une requête CIBA reste valide avant d’expirer :

ParamètreDéfautNotes
Durée de la Requête300 secondes (5 minutes)Temps maximum que l’utilisateur a pour approuver ou refuser
Intervalle de Polling5 secondesIntervalle minimum pour les clients en mode poll

Implémentation (Mode Poll)

const AURIS_DOMAIN = 'https://auth.votredomaine.com' const CLIENT_ID = 'votre-client-id' const CLIENT_SECRET = 'votre-client-secret' // Étape 1 : Initie l'authentification backchannel const cibaResponse = await fetch(`${AURIS_DOMAIN}/api/oauth/ciba`, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': `Basic ${btoa(`${CLIENT_ID}:${CLIENT_SECRET}`)}`, }, body: new URLSearchParams({ login_hint: '[email protected]', scope: 'openid profile email', binding_message: 'Connexion à MonApp depuis le bureau', }), }).then(r => r.json()) const { auth_req_id, expires_in, interval } = cibaResponse // Étape 2 : Interroge pour le résultat async function pollCiba(auth_req_id) { while (true) { await new Promise(resolve => setTimeout(resolve, interval * 1000)) const response = await fetch(`${AURIS_DOMAIN}/api/auth/token`, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': `Basic ${btoa(`${CLIENT_ID}:${CLIENT_SECRET}`)}`, }, body: new URLSearchParams({ grant_type: 'urn:openid:params:grant-type:ciba', auth_req_id, }), }).then(r => r.json()) if (response.access_token) { return response // Utilisateur approuvé } else if (response.error === 'authorization_pending') { continue // Attends toujours la réponse de l'utilisateur } else if (response.error === 'access_denied') { throw new Error('Utilisateur a refusé la demande') } else { throw new Error(response.error) } } } const tokens = await pollCiba(auth_req_id)

Guides Associés