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 :
- Le client envoie une requête d’authentification backchannel à
/api/oauth/cibaavec unlogin_hint(e-mail, numéro de téléphone ou user ID) qui identifie l’utilisateur - Auris valide la requête et envoie une notification à l’utilisateur sur son appareil ou canal enregistré
- L’utilisateur voit les détails de la demande (nom de l’application, binding message) et approuve ou refuse
- 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 :
| Mode | Fonctionnement | Idéal Pour |
|---|---|---|
| Poll | Le client interroge l’endpoint token à intervalles réguliers jusqu’à ce que l’utilisateur réponde | Intégrations simples, clients côté serveur |
| Ping | Auris envoie une notification à un callback URL pré-enregistré, puis le client échange l’auth request ID contre un token | Architectures event-driven |
| Push | Auris 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 :
| Canal | Prérequis |
|---|---|
| L’utilisateur doit avoir une adresse e-mail vérifiée | |
| SMS | L’utilisateur doit avoir un numéro de téléphone vérifié. Nécessite la configuration du fournisseur SMS (Twilio). |
| Push | Né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ètre | Défaut | Notes |
|---|---|---|
| Durée de la Requête | 300 secondes (5 minutes) | Temps maximum que l’utilisateur a pour approuver ou refuser |
| Intervalle de Polling | 5 secondes | Intervalle 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
- Device Authorization Flow — Authentification pour appareils sans navigateur
- Paramètres OAuth2 Avancés — Configuration CIBA dans la Console