Mise en place d'un exemple d'application

Getting Started with Adaptive Access for Native Applications

Introduction

Ce guide explique comment utiliser Adaptive Access dans une application native NodeJS en utilisant les packages Adaptive Browser SDK et Adaptive Proxy SDK.

Le SDK du navigateur adaptatif est utilisé pour diffuser le JavaScript côté client qui permet la collecte de données dans le navigateur. Le SDK Adaptive Proxy fournit des classes qui gèrent les transactions d'authentification dépendant de politiques qui incluent des déterminations de risque d'accès adaptatif.

Pour mieux comprendre les différentes entités impliquées dans l'accès adaptatif, voir Adaptive SDK.

Prérequis

Vous devez déjà avoir créé une définition d'application personnalisée pour votre application et l'avoir intégrée à l'Adaptive Sign-On. Voir Embarquez votre application.

NodeJS doit être installé sur la machine où vous allez créer et exécuter l'exemple d'application décrit dans ce guide. NodeJS est disponible pour de nombreuses plateformes, notamment Windows, MacOS, et Linux. Téléchargez et installez NodeJS ici.

Mise en place de l'environnement

Vous allez maintenant mettre en place votre environnement de développement en créant un nouveau projet Node et en installant quelques dépendances initiales.

Créer un nouveau projet Node

Dans un répertoire vide, créez un nouveau projet Node à l'aide de la commande bash suivante :

npm init -y

Cela créera un fichier package.json, qui conservera la trace de toutes les dépendances de votre projet, facilitant ainsi votre processus de développement.

Installer les dépendances

Les dépendances suivantes sont nécessaires pour cet exemple d'application :

Utilisez npm pour installer ces dépendances :

npm install adaptive-browser-sdk adaptive-proxy-sdk express body-parser express-session

Créer un fichier index.js

Le fichier index.js sera le point de départ de votre projet. Il s'agit du script qui sera exécuté en premier lorsque vous lancerez votre projet.

touch index.js

Configuration du serveur Express

Modifiez le fichier index.js à l'aide d'un éditeur de texte ou d'un IDE. Importez les dépendances et configurez votre serveur Express en ajoutant le code suivant à votre fichier index.js.

const express = require('express');
const app = express();

// Add JSON middleware, since we'll be handling JSON requests
app.use(express.json());

// add session awareness
const session = require('express-session')
app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true,
}));

// Define a static route into the Adaptive Browser SDK npm module
// so that the client-side code can be loaded at /static/adaptive-v1.js
app.use('/static/adaptive-v1.js', express.static(__dirname
         + '/node_modules/adaptive-browser-sdk/dist/adaptive-v1.min.js'));

Ajout d'une page de connexion

Après l'intégration d' une application, un extrait de page web est fourni. Cet extrait charge le SDK du navigateur adaptatif en utilisant le lien statique que vous avez ajouté à votre application NodeJS dans la section précédente. Vous allez maintenant créer une page de connexion pour l'exemple d'application et intégrer le snippet web.

Créer un fichier login.html

Créez le fichier login.html dans le répertoire racine de votre projet. Cette page demandera à l'utilisateur ses identifiants de connexion lors de la collecte.

touch login.html

Intégrer un snippet web dans la page de connexion

La page login.html doit inclure le snippet web créé pour l'application dans le <head> de la page pour charger et initialiser le Browser SDK. Le SDK du navigateur effectuera alors la collecte de données côté client requise par Adaptive Access.

Ajoutez le code suivant à la page login.html:

<html>

<head>
  <!--
    Paste the script snippet that was provided when you
    on-boarded your application.
  -->

</head>

<body>
  <h1>Login</h1>
  <form name='login' action='/login' method='POST'>

    <label for='username'>Username:</label><br>
    <input type='text' id='username' name='username'><br>

    <label for='password'>Password:</label><br>
    <input type='password' id='password' name='password'><br>

    <input type='submit' value='Submit'>
  </form>
</body>

</html>

Collez l'extrait de site web fourni lors de l'intégration dans la page login.html- en remplaçant le bloc <!-- ... --> qui indique où le placer.

❗️

N'invoquer le SDK du navigateur que sur les pages de connexion et de recollection

Le SDK du navigateur ne doit pas être invoqué sur des pages qui ne sont pas la page de connexion ou la page de recollection. L'exécution de la collecte sur d'autres pages peut entraîner un comportement inattendu.

Veiller à ce que la collecte soit complète

Avec le snippet web en place, le SDK du navigateur commencera à fonctionner en arrière-plan dès que la page de connexion sera chargée. Cela permet de l'exécuter pendant que l'utilisateur entre ses données de connexion.

Il est important qu'une fois que l'utilisateur a saisi ses données de connexion, la soumission du formulaire soit augmentée. Il existe deux raisons à cela :

  • Il est nécessaire de capturer le site sessionID généré par le SDK du navigateur. Cette adresse sessionID est utilisée dans les appels de l'API à IBM Verify pour les mettre en corrélation avec les données recueillies dans le navigateur.
  • Pour s'assurer que le SDK du navigateur termine son exécution avant que l'utilisateur ne quitte la page.

Le SDK du navigateur fournit une fonction, getSessionId(), qui renvoie une promesse. La résolution de cette promesse comprendra l'identifiant de la session. Cette méthode doit être invoquée et la promesse renvoyée doit être enchaînée dans la soumission du formulaire, de sorte que la séquence suivante soit respectée :

  1. L'utilisateur soumet le formulaire
  2. Le SDK du navigateur résout la promesse d'ID de session
  3. Le formulaire de connexion est complété pour inclure l'identifiant de session
  4. Soumission du formulaire

Par conséquent, dans votre page de connexion, vous devez compléter la soumission du formulaire par la modification suivante :

window.addEventListener('load', function (e) {
  var form = document.getElementsByName('login')[0];
  form.addEventListener('submit', function (event) {
    event.preventDefault();
    getSessionId().then(sessionID => {
      const sessionIDField = document.createElement('input');
      sessionIDField.type = 'hidden';
      sessionIDField.name = 'sessionId';
      sessionIDField.value = sessionID;
      form.appendChild(sessionIDField);
      form.submit();
    });
  });
});

Votre page de connexion devrait maintenant ressembler à ceci :

<html>

<head>
  <script src="/static/adaptive-v1.js"></script>
  <script>startAdaptiveV1("xxxxxx.cloudfront.net", 123456);</script>

  <script>
    window.addEventListener('load', function (e) {
      var form = document.getElementsByName('login')[0];
      form.addEventListener('submit', function (event) {
        event.preventDefault();
        getSessionId().then(sessionID => {
          const sessionIDField = document.createElement('input');
          sessionIDField.type = 'hidden';
          sessionIDField.name = 'sessionId';
          sessionIDField.value = sessionID;
          form.appendChild(sessionIDField);
          form.submit();
        });
      });
    });
  </script>

</head>

<body>
  <h1>Login</h1>
  <form name='login' action='/login' method='POST'>

    <label for='username'>Username:</label><br>
    <input type='text' id='username' name='username'><br>

    <label for='password'>Password:</label><br>
    <input type='password' id='password' name='password'><br>

    <input type='submit' value='Submit'>
  </form>
</body>

</html>

L'augmentation peut également être incluse dans une chaîne de promesses, si la validation et la soumission sont déjà gérées en JavaScript. Par exemple :

function formSubmit() {
  validateFormFields().then(formData => {
    return getSessionId().then(sessionID => {
      formData['sessionId'] = sessionID;
      return formData;
    })
  }).then(formData => postForm(formData));
}

Pour la documentation de l'API pour le SDK du navigateur, voir le README de GitHub.

Servir la page de connexion

Pour exposer votre nouvelle page login.html, vous devez l'ajouter en tant que ressource à l'application NodeJS. Pour vous faciliter la tâche, vous ajouterez également une page racine qui redirigera vers cette page de connexion si la session n'est pas authentifiée.

Ajoutez ce qui suit au fichier index.js créé ci-dessus :

// Create a home page that redirects to /login if authentication not complete.
// Returns session token object if authenticated.
app.get('/', (req, res) => {
  if (!req.session.token) {
    res.redirect('/login');
  } else {
    res.send(req.session.token);
  }
});

// Expose the '/login.html' file for GET /login.
app.get('/login', (_, res) => {
  res.sendFile(__dirname + '/login.html');
});

// Start the server on port 3000.
const port = 3000;
app.listen(port, console.log(`Listening on port ${port}...`));

🚧

Questions de domaine

Pour que le processus de collecte fonctionne correctement, il faut accéder au serveur en utilisant un domaine autorisé spécifié lors de l'intégration de l'application.

Si vous n'êtes pas encore prêt à exécuter l'application sur votre serveur public, une solution temporaire consiste à ajouter 127.0.0.1 www.<YOUR.ALLOWED.DOMAIN> au fichier /etc/hosts sur votre machine de développement locale.

Commencez votre demande. Vous pouvez le faire à l'aide de cette commande :

node index.js

Lorsque le serveur est en cours d'exécution, accédez à l'application dans un navigateur :
http://www.<YOUR.ALLOWED.DOMAIN>:3000/

Si tout va bien, vous devriez voir ce qui suit au chargement de votre page de connexion (dans ce cas avec les outils de développement affichant la console JavaScript ):

1390

Console de collecte du SDK du navigateur adaptatif

La fenêtre du navigateur indique que la page de connexion a été affichée avec succès. La trace de la console montre que le SDK du navigateur adaptatif a été appelé avec succès et que le service a renvoyé un identifiant de session.

La logique d'application permettant de gérer la page de connexion soumise sera ajoutée ultérieurement.

Arrêtez l'application en appuyant sur Ctrl-C dans le terminal où s'exécute votre processus Node.

Hébergement d'une ressource statique connue

Dans le cadre de l'ajout du SDK du navigateur, une ressource statique doit également être ajoutée à l'application. Il est recommandé d'utiliser un PNG transparent de 1x1 pixel.

Cette ressource statique doit être disponible sur le chemin d'accès /icons/blank.gif et répondre aux exigences suivantes :

  1. Il ne doit exister aucune redirection automatique de cette URL vers une autre page Web.
  2. Vous devez ajouter une exception complète à toute politique de sécurité du contenu (CSP).
  3. La taille maximale de l'image est de 500 octets.
  4. Le type d'image doit être image/gif, image/png, image/jpeg, ou image/jpg.
  5. La ressource statique doit inclure un en-tête de type de contenu, par exemple Content-Type:image/png, afin d'éviter d'inviter l'utilisateur à télécharger la ressource.

Le SDK du navigateur comprend une ressource statique qui peut être exposée de la même manière que le SDK du navigateur lui-même.

Ajoutez le code suivant à la fin de votre fichier index.js:

// Define a static route into the Adaptive Browser SDK npm module
// so that the blank gif is available at /icons/blank.gif
app.use('/icons/blank.gif', express.static(__dirname
                 + '/node_modules/adaptive-browser-sdk/blank.gif'));

Ajouter le SDK proxy à l'application

Le Proxy SDK permet à un serveur d'application d'utiliser facilement l'API /token dans des flux natifs.

Il est faiblement couplé au SDK du navigateur et n'impose pas d'exigences de déploiement spécifiques à l'application. Cela permet au développeur de contrôler la manière dont le formulaire de connexion interagit avec l'application dorsale.

500

Interaction entre les navigateurs et les SDK de proxy

Initialiser le SDK

Afin d'utiliser le Proxy SDK, il doit être requis et initialisé. L'initialisation nécessite trois entrées :

  • tenantUrl- Le site URL de votre locataire IBM Verify.
  • clientId- L'identifiant du client de votre application personnalisée.
  • clientSecret- Le secret du client de votre application personnalisée.

Pour savoir comment obtenir le site clientId et clientSecret, voir On-boarding a native application.

📘

Informations d'identification de l'application

Les adresses client_id et client_secret utilisées par le SDK adaptatif sont des identifiants d'application et non des identifiants de client API.

Ajoutez ces lignes à la fin de votre fichier index.js (en remplaçant les valeurs par celles de votre locataire et de votre application):

// Initialize Adaptive Proxy SDK
const Adaptive = require('adaptive-proxy-sdk');
const adaptiveConfig = {
  tenantUrl: 'https://cloudidlab.ice.ibmcloud.com', // Your Verify tenant URL
  clientId: '6d7393c8-53c3-4d0b-844b-886e28cb9af5', // Your Verify client ID
  clientSecret: '2coMYUTIzg', // Your Verify client secret.
};
const adaptive = new Adaptive(adaptiveConfig);

🚧

Protégez vos secrets

Dans le cadre d'une utilisation en production, le site clientSecret est généralement extrait d'un magasin sécurisé géré par le déploiement de l'application.

Maintenant que le SDK est initialisé, nous pouvons authentifier un utilisateur.

Utilisation du Proxy SDK pour authentifier un utilisateur

Le Proxy SDK crée et gère une "transaction" d'authentification qui comprend l'authentification initiale (premier facteur) et l'authentification multi-facteurs optionnelle (MFA), en gérant l'état à travers les demandes.

Entrées SDK

Le serveur d'application doit fournir trois éléments lorsqu'il appelle les fonctions du SDK Adaptive Proxy :

  • ID de session- Il est reçu dans les données POST de la page de connexion.
  • Adresse IP- Soit extraite directement de la demande, soit consommée à partir d'un en-tête fourni par le point final qui a reçu la demande (c'est-à-dire X-forwarded-for ).
  • User-Agent- un en-tête standard inclus dans les requêtes HTTP (c'est-à-dire User-Agent ).

Ces valeurs sont transmises au Proxy SDK sous la forme de context. Ce contexte est inclus dans l'appel de l'API à /token.

Réponse du SDK

Lors de l'intégration avec le Proxy SDK, trois types de réponses peuvent devoir être gérées :

  • Autoriser- Authentification terminée. Les jetons d'identité et d'accès sont inclus dans cette réponse.
  • Deny- L'utilisateur se voit refuser l'accès. Aucune autre action n'est possible.
  • Require- Authentification supplémentaire requise. Informations sur les méthodes autorisées.

Les fonctions du SDK peuvent également générer des erreurs. Cela peut se produire lorsque, par exemple, le nom d'utilisateur et le mot de passe fournis sont incorrects.

Création d'un flux de travail de connexion

Ces trois réponses permettent de construire un flux de travail tel que :

  1. L'utilisateur initie la connexion
  2. Évaluation du premier facteur réalisée
    • L'utilisateur peut se voir refuser l'accès à ce moment-là.
      • par exemple, tentative d'accès à partir d'un pays interdit
    • L'utilisateur peut être tenu d'utiliser des méthodes spécifiques de premier facteur
  3. L'utilisateur est invité à se connecter au moyen d'un premier facteur
    • L'utilisateur se connecte avec succès
  4. Réalisation d'une évaluation adaptative des risques
    • L'utilisateur peut être autorisé à accéder immédiatement en raison d'un score de risque évalué faible
    • L'utilisateur peut être amené à fournir d'autres facteurs d'authentification
    • L'utilisateur peut se voir refuser l'accès en raison d'un score de risque élevé
500

Diagramme d'état des flux

En fonction de l'expérience utilisateur requise dans l'application, deux approches peuvent être adoptées :

  1. Lorsque vous utilisez l'authentification par mot de passe pour le premier facteur, vous pouvez présenter la page de connexion à l'utilisateur immédiatement, puis initialiser la transaction d'authentification adaptative uniquement lorsque l'utilisateur a fourni un nom d'utilisateur et un mot de passe.

  2. En cas d'utilisation d'autres méthodes de premier facteur, ou lorsque les règles de préauthentification peuvent modifier les méthodes de premier facteur proposées, la transaction d'authentification adaptative doit être initialisée avant la présentation de la page de connexion. Dans ce cas, l'identifiant de session utilisé dans l'appel initial au SDK doit être une chaîne vide (puisque la collecte par le SDK du navigateur n'a pas encore été exécutée).

Cet exemple d'application ne prend en charge que l'authentification par mot de passe comme premier facteur et utilise donc la première approche parce qu'elle est plus simple à mettre en œuvre.

Ajoutez les lignes suivantes à la fin de votre fichier login.js:

// add body parsing
const bodyParser = require('body-parser');

// Add url form-encoded middleware to process login form
app.use(bodyParser.urlencoded({
  extended: true
}));

var identitySourceId;

// Manage login form POST to /login
app.post("/login", async (req, res) => {
  // Extract parameters from request.
  const username = req.body.username;
  const password = req.body.password;
  const sessionId = req.body.sessionId;

  // Set up context required for call to Adaptive SDK
  var context = {
    sessionId: sessionId,
    userAgent: req.headers['user-agent'],
    ipAddress: req.ip
  };

  // Perform a risk assessment.
  let assessResult = await adaptive.assessPolicy(context);

  if (assessResult.status == "deny") {
    res.status(403).send({
      error: "Denied"
    });
    return
  }

  // Store Adaptive sessionId to session
  req.session.sessionId = sessionId;

  if (assessResult.allowedFactors.filter((entry) =>
                        { return entry.type == "password" }).length > 0) {
    try {

      // Look up identity source ID
      if (!identitySourceId) {
        let identitySources = await adaptive.lookupIdentitySources(
                        context, assessResult.transactionId, "Cloud Directory")
        identitySourceId = identitySources[0].id;
      }

      // Check password - returns risk evaluation
      let result = await adaptive.evaluatePassword(context,
                          assessResult.transactionId, identitySourceId,
                          username, password);

      handleEvaluateResult(req, res, context, result);

    } catch (error) {
      console.log(error);
      if (error.response.data.messageDescription) {
        res.status(403).send({error: error.response.data.messageDescription});
      } else {
        res.status(403).send({error: "Password check failed"});
      }
    }
  } else {
      res.status(403).send({error: "Password login not allowed"});
  }
});

async function handleEvaluateResult(req, res, context, result) {

  // If denied, return 403 forbidden.
  if (result.status == "deny") {
    console.log(result);
    res.status(403).send({error: "Denied"});
    return
  }

  // If allowed, store token and redirect to homepage
  if (result.status == "allow") {
    req.session.token = result.token;
    res.redirect("/");
    return
  }

  // MFA Case to be handled here

}

Note : L'objet adaptive a été initialisé à l'aide du proxy SDK dans une section précédente.

📘

Identité Source ID

Dans le code ci-dessus, l'identifiant de la source d'identité pour le répertoire du nuage est obtenu dynamiquement sur la base de son nom. Si vous préférez, vous pouvez coder en dur l'ID de la source d'identité. Vous pouvez trouver l'ID d'une source d'identité en regardant ses propriétés dans l'interface d'administration de votre locataire (sous Configuration->Sources d'identité)

Exécution de l'authentification multi-facteur

Le code de la section précédente ne traite que les réponses deny et allow après l'authentification à première vue. Dans cette section, vous ajouterez du code pour gérer le cas où une authentification multifactorielle supplémentaire est requise.

Un défi d'AMF est détecté en vérifiant la présence d'un status ayant la valeur requires. Un statut "requires" indique qu'une authentification supplémentaire doit être effectuée par l'utilisateur final. Il est possible qu'un statut "requires" soit renvoyé chaque fois que /token est invoqué, que ce soit pour établir une subvention ou pour utiliser un jeton de rafraîchissement.

📘

Contrôle de l'évaluation des politiques

Vous pouvez contrôler le moment où l'AMF est requise en ajoutant ou en ajustant les règles à l'aide de l'éditeur de politique. Pour plus d'informations sur la politique, voir Politique d'accès aux applications natives.

Vous allez maintenant ajouter du code pour gérer une réponse requires, traiter les inscriptions renvoyées et lancer l'OTP par courrier électronique s'il est disponible.

Insérez le code suivant à l'endroit où vous voyez // MFA Case to be handled here dans votre fichier index.js:

if (result.status == "requires") {

    // Extract type from each available factor.
    var availableFactors = result.enrolledFactors.map(f => f.type);

    // Save transactionId to session
    req.session.transactionId = result.transactionId;

    // In this instance we're only supporting email OTP
    var emailIdx = availableFactors.indexOf("emailotp");
    if (emailIdx != -1) {
      req.session.currentFactor = "emailotp";

      try {
        // Initiate the email OTP
        await adaptive.generateEmailOTP(context, result.transactionId,
                                        result.enrolledFactors[emailIdx].id);
        // Return /otp challenge page;
        res.sendFile(__dirname + '/otp.html');;

      } catch (error) {
        res.status(500).send({error: "OTP generate fail: " + error.message});
      }
    } else {
      res.status(500).send({ error: "Email OTP factor not available."
                             + JSON.stringify(result)});
    }
  }

Créez un fichier nommé otp.html et remplissez-le avec ce contenu simple pour présenter un défi OTP :

<html>

<head>
</head>

<body>
  <h1>Submit OTP</h1>
    <p>If the received code's format is 1234-567890
       only enter the group of digits after the '-',
       i.e. 567890</p>
  <form name="otpform" action="/otp" method="POST">

    <label for="otp">OTP:</label><br>
    <input type="text" id="otp" name="otp"><br>

    <input type="submit" value="Submit">
  </form>
</body>

</html>

Ajoutez ce qui suit à la fin de votre fichier index.js pour exposer cette page OTP et gérer le POST qu'elle renvoie lorsque l'utilisateur soumet l'OTP :

// Handle OTP challenge page POST to /otp
app.post("/otp", async (req, res) => {
  const otp = req.body.otp;

  // Get adaptive transaction from session
  var transactionId = req.session.transactionId;

  // Set up context required for call to Adaptive SDK
  var context = {
    sessionId: req.session.sessionId,
    userAgent: req.headers['user-agent'],
    ipAddress: req.ip
  };

  // Verify the email OTP - risk evaluation returned
  try {
    let result = await adaptive.evaluateEmailOTP(context, transactionId, otp);

    // If denied, return 403 forbidden
    if (result.status == "deny") {
      res.status(403).send({error: "Denied"});
      return
    }

    // If allowed, save token and redirect to homepage
    if (result.status == "allow") {
      req.session.token = result.token;
      res.redirect("/");
      return
    }

  } catch (error) {
    console.log(error);
    if (error.response.data.messageDescription) {
      res.status(403).send({error: error.response.data.messageDescription});
    } else {
      res.status(403).send({error: error.message});
    }
  }
});

L'OTP fourni par l'utilisateur est vérifié en appelant la fonction evaluateEmailOTP

Si l'OTP est incorrect, la fonction génère une erreur.

Il serait inhabituel de recevoir un statut deny à ce stade, mais cela est possible et doit être traité.

Si l'OTP est correct, la réponse aura le statut allow. Dans ce cas, un jeton d'identité (JWT) et un jeton d'accès pour l'utilisateur authentifié seront également renvoyés. Il appartient au développeur de l'application de stocker ces jetons dans la session et de marquer la session comme étant authentifiée.

Voici un exemple de l'objet de résultat renvoyé :

{
  "status": "allow",
  "token": {
    "access_token": "gJduCYHPK0jG7RBiMSiQ3WtGQvxUzpp4GtqTZi8s",
    "scope": "openid",
    "grant_id": "24c6fa4e-dca5-4876-bd24-6b897920d74b",
    "id_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InNlcnZlciJ9.eyJhY3IiOi...HAiOiAxNTk5MTAxMzY3fQ.HZ9LE3Hb3GkXD..7sQJFlXoXGP3w",
    "token_type": "Bearer",
    "expires_in": 7199
  }
}

Dans cet exemple d'application, vous êtes redirigé vers / une fois l'authentification terminée. La présence du jeton entraîne l'affichage d'un simple message You are authenticated.

Félicitations ! Vous avez configuré avec succès une application native pour Adaptive Access.

Validation

Après avoir déployé avec succès votre application web et incorporé le SDK du navigateur adaptatif IBM Verify et le SDK du proxy IBM Verify, une validation de bout en bout peut être réalisée.

Scénario de validation

Nous pouvons utiliser un scénario de validation simple pour nous assurer que la configuration de l'application Web native et de l'accès adaptatif est correcte.

Si le scénario n'aboutit pas, vous devez

  1. utiliser les informations contenues dans le site Événements et rapports pour déterminer le résultat de l'événement et du rapport (succès, événement manquant, indisponible, inattendu)
  2. suivez les étapes de dépannage pour ce type de résultat, comme décrit dans la section Dépannage de l'accès adaptatif.
  • Le scénario de validation simple recommandé comprend

    1. Créer un utilisateur
    2. S'authentifier auprès de l'application Web
    3. Relever le défi de l'AMF
    4. Accéder à l'application
  • Le scénario est validé :

    1. IBM Verify Intégration du SDK du navigateur adaptatif
    2. Collecte et détection des navigateurs des clients
    3. IBM Verify Invocation du SDK Proxy
    4. Invocation et évaluation de la politique d'accès adaptative
  • L'expérience de l'utilisateur doit être :

    1. Lancer l'application Web native
    2. Défi du premier facteur (mot de passe)
    3. Défi AMF (e-mail OTP)
    4. Accès autorisé

Page de connexion chargée

À l'aide des Developer Tools du navigateur, vérifiez que le SDK du navigateur lance la collecte et la détection des accès adaptatifs.
Ces demandes doivent être visibles dans l'onglet Network et inclure une demande à l' URL cloudfront qui a été fournie lors de l'intégration de l'application.
Par exemple :

https://d1anfu45urknyg.cloudfront.net/511843/aloads.js?dt=login&r=0.3289762412868322

Vous devriez voir des chargeurs JavaScript supplémentaires demandés, qui peuvent inclure

  • bits.js
  • main.js
  • tags.js

Ces chargeurs doivent renvoyer un code de réponse 200 avec un corps de réponse non vide.

De plus, vous devriez voir plusieurs autres requêtes vers la même URL cloudfront avec des chemins URI différents au fur et à mesure que la collecte se poursuit.

1021

Native Web application login. collection, detection and Session ID generation

ID de session généré

Lors de l'invocation de getSessionId() à partir du SDK du navigateur, la console des Developer Tools navigateur affichera Session ID qui peut être utilisé pour effectuer la corrélation de l'ID de session avec le rapport d'accès adaptatif ou l'API du service d'événements.
Par exemple

CDN snippet loaded
[:getTCSID(csid)] csid: pp24c528943651cbe63c91dd0590b24323a80a0b401600954689
[:getFlow()]

Si la sortie de la trace a été effacée ou si Developer Tools n'était pas ouvert pendant la collecte et que le site Session ID n'est pas visible, vous pouvez invoquer le SDK du navigateur pour obtenir l'ID de la session sans déclencher la collecte.

await getSessionId()

qui renvoie l'identifiant de la session en cours

pp24c528943651cbe63c91dd0590b24323a80a0b401600954689

Évaluation de la politique d'accès

Après l'authentification initiale, la politique d'accès adaptative pour les applications natives est évaluée. Lorsque l'on utilise l'action recommandée de MFA per session pour le niveau de risque Medium dans les règles de post-authentification, les nouveaux utilisateurs seront invités à se soumettre à l'AMF lors de l'établissement de la session.

Une fois l'AMF terminée, la session de l'utilisateur sera ramenée au niveau de risque Low et l'utilisateur sera autorisé à accéder à l'application - à moins que le même utilisateur ne tente de se connecter à partir d'un nouvel appareil.

1344

Native Web application Adaptive access policy

Rapport sur l'accès adapté

Lors de l'utilisation de la politique d'accès adaptative recommandée, le nouvel utilisateur sera évalué au niveau de risque Medium et devra se soumettre à l'AMF (par session). Une fois le défi MFA relevé, la politique d'accès adaptative est réévaluée et l'utilisateur devrait maintenant être évalué comme étant de niveau de risque Low et autorisé à accéder.

📘

Niveaux de risque

Si la collecte et la détection révèlent des indications de risque spécifiques, l'utilisateur peut être évalué à un niveau de risque plus élevé.

Des exemples de niveaux de risque sont décrits dans les niveaux de risque de la note de confiance.

Dans l'exemple suivant de rapport sur l'accès adaptatif

  • la ligne du bas indique Risk Service Unavailable en raison de l'exécution du scénario de validation avant la fin de l'intégration.
    L'action politique correspondant au niveau de risque Medium est appliquée.
  • la ligne du milieu indique que l'évaluation du nouvel utilisateur est Medium Niveau de risque, car c'est la première fois que cet utilisateur est évalué sur cet appareil.
  • la ligne supérieure montre la réévaluation de la politique après la réussite de l'AMF.
    Il est maintenant vérifié que l'utilisateur utilise ce navigateur pour cette application et le niveau de risque est évalué à Low.

Les détails clés de l'évaluation sont affichés lors de la sélection d'une ligne d'événement.
L'identifiant de session doit correspondre à celui généré par le SDK Web dans la page de connexion.

1344

Lors des authentifications ultérieures (logins) ou du rafraîchissement du jeton, l'utilisateur doit continuer à être évalué au niveau de risque Low, à moins qu'un indicateur Adaptive details ne soit déclenché et ne modifie le niveau de risque de l'utilisateur, par exemple, un ou plusieurs des éléments suivants :

  • Anomalie comportementale
  • Nouvel appareil
  • Appareil à risque
  • Connexion à risque
  • Nouvel emplacement
1344

Adaptive access report detail for new user reauthentication and refresh

Si la validation de l'accès adaptatif ne s'exécute pas correctement, le dépannage peut commencer en suivant la procédure de collecte de données décrite dans la section Événements et rapports.