Connexion via un code Quick Response

Introduction

Dans ce guide, vous apprendrez comment le QR Code Login peut être exécuté de manière programmatique via les API REST à l'aide d' IBM Security Verify. La connexion par code QR permet une authentification de l'utilisateur au premier facteur en scannant simplement un code QR à l'aide d'un authentificateur enregistré (généralement exécuté sur un appareil mobile).

Pour en savoir plus, consultez les concepts de connexion par code QR.

Prérequis

Un utilisateur final qui s'authentifie à l'aide de QR Code Login doit disposer de l'application IBM Verify sur son appareil mobile et l'avoir enregistrée sur son compte. Consultez le Centre de connaissances pour obtenir des informations à ce sujet.

Le client API utilisé par l'application doit disposer des autorisations suivantes dans IBM Security Verify:

  • Lire la configuration de l'authentificateur (pour obtenir l'ID de l'authentificateur)
  • Authentifier n'importe quel utilisateur (pour exécuter le flux de connexion)
  • Lire les utilisateurs et les groupes (pour consulter les données des utilisateurs)
    Pour plus d'informations sur la création d'un client API, voir Créer un client API.

L'application doit avoir acquis un jeton d'accès à l'aide du flux "Client Credentials ".

Variables

Les variables suivantes sont nécessaires pour exécuter le flux décrit dans ce guide :

VariablesExemple de valeurDescription
uRL du locatairetenant.verify.ibm.comURL de votre locataire IBM Security Verify.
jeton d'accèseWn4Z5xChc3q9B9dqbGgFlsHDh7uhAOnmNeKW5EzLe jeton d'accès obtenu à partir du point de terminaison du jeton.

Rechercher l'identifiant du client de l'authentificateur

Un locataire IBM Security Verify peut prendre en charge plusieurs profils d'enregistrement pour les applications d'authentification QR Code Login et Mobile PUSH. Dans les API, un profil d'enregistrement est appelé " client authentificateur ". Pour ce guide, vous utiliserez le profil par défaut, Verify Profile. Vous allez maintenant rechercher ce client authentificateur par son nom pour obtenir l'identifiant nécessaire pour identifier le client authentificateur lors de l'initiation de la connexion par code QR.

📘

ID du profil d'enregistrement

L'identifiant du profil d'enregistrement de Verify est disponible directement dans l'interface d'administration de Verify. Si vous préférez, vous pouvez sauter cette étape de recherche et obtenir l'ID à partir de l'interface d'administration.

curl -X GET "https://${tenant_url}/v1.0/authenticators/clients?search=name%20%3D%20%22Verify%20Profile%22" -H "Authorization: Bearer ${access_token}"
//Pre-requisites
//var axios = require('axios');
//var tenant_url = "Tenant URL";
//var access_token = "Access Token";

var request = {
  method: 'get',
  url: 'https://' + tenant_url
        + '/v1.0/authenticators/clients'
        + '?search=name = "Verify Profile"',
  headers: {
    'Authorization': 'Bearer ' + access_token
  }
};

axios(request).then((response) => {
  var authclient_id = response.data.clients[0].id;
  console.log(authclient_id);

  //Next code here.

}).catch((error) => {
  console.log(error);
});

La réponse JSON à cet appel a le format suivant :

{
    "total": 1,
    "clients": [
        {
            "authorizationCodeLifetime": 60,
            "name": "Verify Profile",
            "refreshTokenLifetime": 31557600,
            "id": "f4bc8b91-8061-49bf-9c69-46ffcb0b3d7b",
            "enabled": true,
            "accessTokenLifetime": 3600
        }
    ],
    "limit": 200,
    "count": 200,
    "page": 1
}

Vous avez besoin de l'élément clients[0].id de cette réponse et de le stocker en tant qu' authclient_id.

Initier la transaction de connexion par code QR

Une transaction de connexion par code QR est initiée en appelant le point de terminaison /v2.0/factors/qr/authenticate. L'identifiant du client authentificateur doit être fourni dans le paramètre de la chaîne de requête profileId.

curl -X GET "https://${tenant_url}/v2.0/factors/qr/authenticate?profileId=${authclient_id}" --header "Authorization: Bearer ${access_token}"
//Pre-requisites
//var axios = require('axios');
//var tenant_url = "Tenant URL";
//var access_token = "Access Token";
//var authclient_id = "Registration profile ID";

var request = {
  method: 'get',
  url: 'https://' + tenant_url
          + '/v2.0/factors/qr/authenticate'
          + '?profileId=' + authclient_id,
  headers: {
    'Authorization': 'Bearer ' + access_token
  }
};

axios(request)
.then((response) => {
  var qr_txnid = response.data.id;
  var qr_dsi = response.data.dsi;
  console.log(qr_txnid);
  console.log(qr_dsi);
  console.log("***Image***: " + response.data.qrCode);

  //Next code here.

}).catch((error) => {
  console.log(error);
});

La réponse a le format suivant :

{
    "id": "0ac803e1-fabe-43ff-bd69-d0b6deb2ad5e",
    "type": "qr",
    "created": "2021-01-18T12:21:22.257Z",
    "updated": "2021-01-18T12:21:22.257Z",
    "expiry": "2021-01-18T12:23:22.257Z",
    "state": "PENDING",
    "location": "https://tenant.verify.ibm.com/v2.0/factors/qr/0ac803e1-fabe-43ff-bd69-d0b6deb2ad5e",
    "profileId": "f4bc8b91-8061-49bf-9c69-46ffcb0b3d7b",
    "serviceName": "IBM Security Verify",
    "tenant": "tenant.verify.ibm.com",
    "lsi": "u7u44a0tcmo4b6zhg2t6geujd5iu61",
    "dsi": "8097upp060qu5kf1lw0wd42wy4ionp",
    "qrCode": "iVBORw0KGgoAAAANSUhEUgAAASwAAAEsAQAAAA...FTkSuQmCC"
}

Dans cette réponse, vous avez besoin de l'attribut id qui est l'identifiant de la transaction (stocké sous qr_txnid ). Vous aurez également besoin de l'attribut dsi (stocké sous qr_dsi ) lorsque vous demanderez le statut de la transaction. Le code QR qui doit être affiché à l'utilisateur est renvoyé sous la forme d'une image Base64-encoded dans l'attribut qrCode (stocké sous qr_image ).

Afficher le code QR à l'utilisateur

Si vous travaillez dans une application web, une image base64-encoded peut être rendue directement par le navigateur. Utilisez l'extrait HTML suivant (dans ce cas, l'extrait provient d'une vue NodeJS Express utilisant des guidons):

<img src='data:image/png;base64,{{qr_image}}' alt='qrcode' />

À des fins de test, vous pouvez également utiliser un utilitaire en ligne pour afficher l'image base64-encoded afin de pouvoir la scanner. Il existe deux outils de ce type :

Demander l'achèvement du balayage

L'application doit maintenant interroger pour compléter la transaction par code QR. L'opération est terminée lorsque l'utilisateur scanne le code QR à l'aide d'une application d'authentification enregistrée.

L'authentification n'est pas requise pour le sondage. Toutefois, l'appelant doit connaître l'identifiant de transaction et l'identifiant de session de l'appareil associé ( dsi ).

🚧

Interrogation du navigateur

Il est possible d'interroger directement IBM Security Verify à partir du navigateur, mais il faut pour cela que le navigateur dispose de l'ID de transaction et de l'IDS. Il faut également que le système CORS soit configuré pour permettre la requête cross-origin.

Il est généralement préférable que le navigateur interroge l'application et que l'application interroge IBM Security Verify. De cette manière, l'application garde le contrôle du flux.

Les exemples de code suivants illustrent la demande de sondage. Dans le cas du code NodeJS, une boucle est utilisée pour répéter l'interrogation toutes les 3 secondes tant que l'état est "EN ATTENTE".

curl -X GET "https://${tenant_url}/v2.0/factors/qr/authenticate/${qr_txnid}?dsi=${qr_dsi}"
//Pre-requisites
//var axios = require('axios');
//var tenant_url = "Tenant URL";
//var qr_txnid = "QR Transaction ID";
//var qr_dsi = "QR Device Session Index";

function queryQRtxn() {

  var request = {
    method: 'get',
    url: 'https://' + tenant_url
            + '/v2.0/factors/qr/authenticate/'
            + qr_txnid
            + '?dsi=' + qr_dsi,
  };

  axios(request)
  .then((response) => {
    if(response.data.state == "PENDING") {
      setTimeout(queryQRtxn,3000);
    } else if (response.data.state == "SUCCESS") {
        var user_uuid = response.data.userId;
        console.log(user_uuid);

        //Next code here

    } else {
      console.log("QR Code validation failure");
    }
  }).catch((error) => {
    console.log(error);
  });
};

setTimeout(queryQRtxn,3000);
console.log("QR Transaction PENDING");

La réponse au sondage est similaire à la réponse d'initiation, sauf qu'elle n'inclut pas les attributs lsi, dsi ou qrCode. L'attribut le plus important est l' état. Il indique l'état de la transaction.

L'état SUCCESS indique que l'utilisateur a été authentifié par le code QR :

{
    "id": "0ac803e1-fabe-43ff-bd69-d0b6deb2ad5e",
    "userId": "642000EPOU",
    "type": "qr",
    "created": "2021-01-18T12:21:22.257Z",
    "updated": "2021-01-18T12:22:25.143Z",
    "expiry": "2021-01-18T12:23:22.257Z",
    "state": "SUCCESS",
    "updatedBy": "642000EPOU",
    "location": "https://tenant.verify.ibm.com/v2.0/factors/qr/0ac803e1-fabe-43ff-bd69-d0b6deb2ad5e",
    "profileId": "f4bc8b91-8061-49bf-9c69-46ffcb0b3d7b",
    "serviceName": "IBM Security Verify",
    "tenant": "tenant.verify.ibm.com"
}

L'identifiant de l'utilisateur est renvoyé dans l'attribut userId (stocké sous la forme user_uuid ).

Recherche d'informations sur l'utilisateur

La réponse au sondage sur la connexion par code QR ne comprend que l'identifiant unique (uuid) de l'utilisateur qui a été authentifié. Pour obtenir des informations utiles sur cet utilisateur, l'application peut appeler le point de terminaison Utilisateurs SCIM :

curl -X GET "https://${tenant_url}/v2.0/Users/${user_id}" --header "Authorization: Bearer ${access_token}"
//Pre-requisites
//var axios = require('axios');
//var tenant_url = "Tenant URL";
//var access_token = "Access Token";
//var user_uuid = "User UUID";

var request = {
  method: 'get',
  url: 'https://' + tenant_url
          + '/v2.0/Users/' + user_uuid,
  headers: {
    'Authorization': 'Bearer ' + access_token
  }
};

axios(request)
.then((response) => {
  var user_scim = response.data;
  console.log(user_scim);

  //Next code here.

}).catch((error) => {
  console.log(error);
});

L'application dispose maintenant de l'objet SCIM complet de l'utilisateur qui s'est authentifié avec QR Login.

💎

Jon Harry, IBM Security