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.