Passer au contenu principal
Pour utiliser les fonctionnalités Client-Initiated Backchannel Authentication (CIBA), vous devez avoir un forfait Enterprise ou un module complémentaire approprié. Consultez la page Tarification Auth0 pour plus de détails.
Lorsque vous utilisez des notifications push mobiles avec CIBA, l’utilisateur reçoit une notification push pour authentifier ou autoriser une requête sur son appareil mobile inscrit. Vous pouvez envoyer des notifications push mobiles avec CIBA en utilisant l’application Auth0 Guardian ou une application personnalisée intégrée à la Trousse de développement logiciel (SDK) Auth0 Guardian. Le flux CIBA avec notifications push mobiles authentifie et autorise les utilisateurs sur leur appareil mobile, ce qui évite d’avoir besoin d’un navigateur. Comme l’appareil utilisé pour accéder à la ressource n’exige pas de session de navigateur active, l’utilisateur n’a pas besoin d’être connecté avant qu’une requête CIBA soit déclenchée. Cela garantit aussi que le flux CIBA n’aura pas d’incidence sur les sessions existantes que l’utilisateur pourrait avoir. Le diagramme suivant explique de bout en bout le flux CIBA avec notifications push mobiles :
Les sections suivantes expliquent, étape par étape, le fonctionnement de l’authentification des utilisateurs avec CIBA en utilisant des notifications push mobiles.

Prérequis

Pour initier une requête push CIBA à l’aide d’Auth0, vous devez :

Étape 1 : L’application cliente initie une requête CIBA

Utilisez les API de recherche d’utilisateurs pour trouver l’utilisateur qui autorise pour lequel vous souhaitez initier une requête CIBA et obtenir son ID d’utilisateur. Une fois que vous avez un ID d’utilisateur pour l’utilisateur qui autorise, utilisez l’Authentication API ou nos Trousses de développement logiciel (SDK) pour envoyer une requête CIBA au point de terminaison /bc-authorize :
curl --location 'https://{yourDomain}.auth0.com/bc-authorize' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'client_id=<CLIENT_ID>' \
  --data-urlencode 'client_secret=<CLIENT_SECRET>' \
  --data-urlencode 'login_hint={ "format": "iss_sub", "iss": "https://{yourDomain}.auth0.com/", "sub": "<USER_ID>" }' \
  --data-urlencode 'scope=<SCOPES>' \
  --data-urlencode 'binding_message=<BINDING_MESSAGE>'
ParamètresDescription
tenantNom du tenant. Il peut aussi s’agir d’un domaine personnalisé. Si le format iss_sub est utilisé, alors le nom du tenant est transmis dans la revendication iss.
client_idIdentifiant de l’application cliente.
client_secretMéthode d’authentification du client utilisée pour l’authentification de l’utilisateur avec CIBA, comme un Secret client, un JWT de clé privée ou l’authentification mTLS. Si vous utilisez un JWT de clé privée ou mTLS, vous n’avez pas besoin d’inclure le Secret client.
scopeDoit inclure openid.

La portée peut, de façon facultative, inclure offline_access pour demander un Jeton d’actualisation. Toutefois, pour une autorisation unique d’une transaction avec le flux CIBA, un jeton d’actualisation n’est pas nécessaire et n’a aucune signification dans ce contexte.
user_idID de l’utilisateur autorisant la demande, qui est transmis dans la structure login_hint. Si le format iss_sub est utilisé, alors l’ID de l’utilisateur est transmis dans la revendication sub.

L’ID de l’utilisateur peut avoir un format différent selon le fournisseur externe.
requested_expiryDurée maximale, en secondes, pendant laquelle la session CIBA doit être valide. La durée d’expiration demandée pour le flux CIBA est comprise entre 1 et 259200 secondes (72 heures), et sa valeur par défaut est de 300 secondes. Incluez le paramètre requested_expiry pour définir une expiration personnalisée pour le flux CIBA.

Le paramètre requested_expiry aide à déterminer quel canal de notification CIBA utilise :
  • Si vous définissez votre requested_expiry sur une valeur de 300 secondes ou moins, CIBA utilise le canal de notification poussée mobile s’il est activé. Si vous n’avez pas configuré l’AMF pour votre tenant, la requête CIBA échoue.
  • Si vous définissez votre requested_expiry sur une valeur comprise entre 301 et 259200 secondes (72 heures), CIBA utilise le canal de notification par courriel s’il est activé.
binding_messageMessage lisible par un humain utilisé pour lier le flux CIBA entre l’appareil d’authentification et l’appareil de consommation. Le message de liaison est obligatoire et peut contenir jusqu’à 64 caractères. Utilisez uniquement des caractères alphanumériques et les caractères +-_.,:#.
Il existe une limite de débit par utilisateur : l’utilisateur autorisant la demande ne recevra pas plus de 5 requêtes par minute.

Étape 2 : le tenant Auth0 accuse réception de la requête CIBA

Si le tenant Auth0 reçoit correctement la requête POST, vous devriez recevoir une réponse contenant un auth-req-id qui fait référence à la requête :
{
    "auth_req_id": "eyJh...",
    "expires_in": 300,
    "interval": 5
}
La valeur auth_req_id est transmise au point de terminaison /token pour interroger ce dernier jusqu’à l’achèvement du flux CIBA.

Étape 3 : l’application cliente interroge périodiquement pour obtenir une réponse

Utilisez l’Authentication API ou nos SDK pour appeler le point de terminaison /token avec le grant type urn:openid:params:grant-type:ciba et la valeur auth_req_id que vous avez reçue du point de terminaison /bc-authorize :
curl --location 'https://$tenant.auth0.com/oauth/token' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'client_id=<CLIENT_ID>' \
  --data-urlencode 'client_secret=<CLIENT_SECRET>' \
  --data-urlencode 'auth_req_id=<AUTH_REQ_ID>' \
  --data-urlencode 'grant_type=urn:openid:params:grant-type:ciba'
Tant que l’utilisateur autorisant n’a pas approuvé la transaction, vous devriez recevoir la réponse suivante :
{
    "error": "authorization_pending",
    "error_description": "L'autorisation de l'utilisateur final est en attente"
}
Il y a un intervalle d’attente d’environ cinq secondes pour le sondage (polling). Si vous sondez trop fréquemment, vous recevrez la réponse suivante, dont la description varie en fonction de l’intervalle de temporisation (backoff) :
{
"error": "slow_down",
"error_description": "Vous interrogez trop rapidement. Réessayez dans 10 secondes."
"interval": 10
}
Pour résoudre l’erreur, attendez jusqu’au prochain intervalle (en secondes) avant de sonder de nouveau le point de terminaison /token.

Étape 4 : L’application mobile reçoit la notification push

Auth0 envoie une notification push à l’application ou à l’appareil mobile enregistré de l’utilisateur par l’entremise de l’application Auth0 Guardian ou d’une application personnalisée intégrée à la trousse de développement logiciel (SDK) Auth0 Guardian. Si vous utilisez une application personnalisée, la trousse de développement logiciel (SDK) Auth0 Guardian fournit des méthodes pour analyser les données reçues de la notification push et renvoyer une instance Notification prête à l’emploi. L’instance Notification comprend un identifiant de liaison de transaction, ou txlinkid, que l’application mobile utilise pour récupérer les détails du consentement à partir d’Auth0. Les extraits de code suivants sont des exemples d’implémentations de notifications push mobiles iOS et Android utilisant la trousse de développement logiciel (SDK) Guardian :
// implémentation de UNUserNotificationCenterDelegate
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {
    let userInfo = notification.request.content.userInfo
    if let notification = Guardian.notification(from: userInfo) {
         // Implémentez cette fonction pour afficher la demande et traiter le consentement ou le refus de l'utilisateur.
         handleGuardianNotification(notification: notification)
    }
}
Votre application Auth0 Guardian ou votre application personnalisée intégrée au SDK Auth0 Guardian récupère les détails du consentement, c’est-à-dire le contenu du champ binding_message, à partir de l’API Auth0 Consent. Si vous utilisez une application personnalisée, les exemples de code suivants sont des implémentations iOS et Android qui récupèrent des données à partir de l’API Auth0 Consent :
let device: AuthenticationDevice = // l’objet que vous avez obtenu lors du processus d’inscription initial au SDK Guardian et stocké localement
if let consentId = notification.transactionLinkingId {
    Guardian
        .consent(forDomain: {yourTenantDomain}, device: device)
        .fetch(consentId: consentId, notificationToken: notification.transactionToken)
        .start{result in
            switch result {
            case .success(let payload):
                // présenter les détails du consentement à l’utilisateur
            case .failure(let cause):
                // un problème est survenu
        }
    }
}
L’Auth0 Consent API répond à l’application Auth0 Guardian ou à votre application personnalisée intégrée à la Trousse de développement logiciel (SDK) Auth0 Guardian avec les détails du consentement, y compris le binding_message, la scope et l’audience. Les scopes retournés à l’application mobile sont filtrés selon votre politique RBAC. Pour en savoir plus, consultez Contrôle d’accès basé sur les rôles. L’application mobile présente la demande d’authentification et/ou les détails du consentement à l’utilisateur. L’exemple de code suivant illustre une réponse de l’Auth0 Consent API :
{
  "id": "cns_abc123",
  "requested_details": {
    "audience": "https://$tenant.auth0.com/userinfo",
    "scope": ["openid"],
    "binding_message": "21-49-38"
  },
  "created_at": 1746693720
  "expires_at": 1746693750
}
L’utilisateur peut accepter ou refuser la demande d’authentification à ce moment.

Étape 7 : L’application mobile renvoie la réponse de l’utilisateur à Auth0

L’application Auth0 Guardian ou votre application personnalisée renvoie la réponse de l’utilisateur à Auth0. Si vous utilisez une application personnalisée intégrée à la Trousse de développement logiciel (SDK) Auth0 Guardian, les extraits de code suivants présentent des implémentations iOS et Android qui gèrent la réponse de l’utilisateur :

L’utilisateur accepte la demande d’authentification

Guardian
    .authentication(forDomain: "{yourTenantDomain}", device: device)
    .allow(notification: notification)
    // ou reject(notification: notification, withReason: "hacked")
    .start { result in
        switch result {
        case .success:
            // la demande d’authentification a été rejetée avec succès
        case .failure(let cause):
            // une erreur s’est produite, vérifiez la cause pour comprendre ce qui s’est mal passé
        }
    }

L’utilisateur refuse la demande d’authentification

Guardian
        .authentication(forDomain: "{yourTenantDomain}", device: device)
        .reject(notification: notification)
        // ou reject(notification: notification, withReason: "hacked")
        .start { result in
            switch result {
            case .success:
                // la demande d’authentification a été rejetée avec succès
            case .failure(let cause):
                // une erreur s’est produite; vérifiez la cause pour comprendre ce qui s’est passé
            }
        }

Étape 8 : Auth0 reçoit la réponse de l’utilisateur après l’achèvement du flux

L’application cliente termine l’interrogation lorsqu’elle reçoit une réponse du point de terminaison /token. Un flux CIBA exige toujours une réponse, soit une approbation, soit un refus, de la part de l’utilisateur qui autorise, et les autorisations existantes ne sont pas vérifiées.

Étape 9 : Auth0 renvoie le jeton d’accès à l’application cliente

 Si l’utilisateur rejette la demande de notification push, Auth0 renvoie à l’application cliente une réponse d’erreur semblable à la suivante :
{
    "error": "access_denied",
    "error_description": "L'utilisateur a refusé la demande d'autorisation ou celle-ci a expiré"
}
Si l’utilisateur approuve la demande push, Auth0 renvoie à l’application cliente un semblable au suivant :
{
    "access_token": "eyJh...",
    "id_token": "eyJh...",
    "expires_in": 86400,
    "scope": "openid",
    "token_type": "Bearer"
}
Le refresh_token ne sera présent que si la portée offline_access a été incluse dans la requête /bc-authorize initiale.

En savoir plus