Exercice : Implémenter des données multi-locataires

Effectué

Cet exercice vous guide dans le processus de :

  • Installation d’Azure Database pour PostgreSQL dans le modèle de déploiement de serveur.
  • Création d’une base de données avec des exemples de données d’inventaires.
  • Intégration du serveur à Microsoft Entra ID.
  • Implémentation d’une application simple basée sur Node.js qui interroge la base de données en s’appuyant sur l’authentification Microsoft Entra.

Remarque

Cet exercice montre une approche simplifiée de la prise en charge multi-locataire en émulant la fonctionnalité multi-locataire de la base de données Azure pour le modèle de déploiement PostgreSQL Hyperscale. Il fournit également une approche simplifiée de l’implémentation de l’authentification Microsoft Entra dans les scénarios multi-locataires en s’appuyant sur les fonctionnalités B2B de Microsoft Entra. Microsoft Entra ID prend directement en charge les applications multi-locataires, mais leur couverture détaillée sort du cadre de ce module.

Dans cet exercice, vous allez :

  • Créer une instance de serveur Azure Database pour PostgreSQL.
  • Se connecter au serveur Azure Database pour PostgreSQL.
  • Créer une base de données et des tables d’exemple.
  • Intégrez le serveur Azure Database pour PostgreSQL à Microsoft Entra ID.
  • Inscrivez une application avec Microsoft Entra ID.
  • Implémentez une application Node.js simple, intégrée à Microsoft Entra.
  • Valider les fonctionnalités de l’application Node.js.

Prérequis

Pour effectuer cet exercice, vous aurez besoin des éléments suivants :

  • Un abonnement Azure.
  • Un compte Microsoft ou un compte Microsoft Entra disposant du rôle Administrateur général pour le locataire Microsoft Entra qui est associé à l’abonnement Azure, et disposant du rôle Propriétaire ou Contributeur dans l’abonnement Azure.
  • Avoir terminé le premier exercice de ce module.

Créer une instance de serveur Azure Database pour PostgreSQL

Commencez par créer une instance de serveur Azure DataBase pour PostgreSQL :

  1. Si nécessaire, lancez un navigateur web, accédez au Portail Azure et connectez-vous pour accéder à l’abonnement Azure que vous utiliserez dans ce module.

  2. Dans la zone de texte Rechercher dans les ressources, services et documents située en haut de la page du Portail Azure, recherchez Azure Database pour PostgreSQL, puis accédez à la liste des résultats dans la section Services et sélectionnez Azure Database pour PostgreSQL.

  3. Dans le volet Serveurs Azure Database pour PostgreSQL, sélectionnez + Créer.

  4. Dans le volet Sélectionner l’option de déploiement Azure Database pour PostgreSQL, dans la vignette Azure Database pour PostgreSQL, pour Type de ressource, sélectionnez Serveur unique.

  5. Cliquez sur Créer.

  6. Dans l’onglet Informations de base du volet Serveur unique, configurez les paramètres suivants, puis sélectionnez Évaluer + créer, tout en conservant les valeurs par défaut de tous les autres paramètres :

    Paramètre Configuration
    Abonnement Sélectionnez le nom de l’abonnement Azure que vous utiliserez dans ce module.
    Resource group Créez un groupe de ressources nommé postgresql-db-RG.
    Nom du serveur Entrez un nom unique composé de lettres minuscules, de chiffres ou de tirets, et qui commence par une lettre.
    Paramètres Sélectionnez Aucun.
    Emplacement Sélectionnez la région Azure située le plus près de l’emplacement de votre environnement lab où vous pouvez créer des instances Azure Database pour PostgreSQL.
    Version Sélectionnez 11.
    Calcul + stockage Sélectionnez le lien Configurer le serveur. Dans le volet Configurer, sélectionnez Bases, choisissez la valeur de vCore1 et le Stockage de 5 Go. Ensuite, cliquez sur OK.
    Nom d’utilisateur administrateur Entrez Student.
    Mot de passe Entrez Pa55w0rd1234.

    Screenshot of the Basics tab of the server blade in the Azure portal.

  7. Sous l’onglet Vérifier + créer du volet Serveur unique, sélectionnez Créer.

  8. Attendez la fin du déploiement. Ceci peut durer environ cinq minutes.

    Notes

    Le processus de déploiement crée automatiquement une base de données nommée postgres dans le serveur cible.

Se connecter au serveur Azure Database pour PostgreSQL

Une fois le serveur Azure Database pour PostgreSQL déployé, vous pouvez vous y connecter à l’aide de l’outil psql.

  1. Dans le volet Aperçu Microsoft.PostgreSQLServer.createPostgreSqlServer, sélectionnez Accéder aux ressources.

  2. Dans le volet Déploiement, accédez à la section Paramètres, puis sélectionnez Sécurité de la connexion dans le menu vertical.

  3. Dans le volet Sécurité de la connexion, configurez Autoriser l’accès aux services Azure sur Oui, sélectionnez + ajouter une adresse IP cliente, configurez Appliquer une connexion SSL sur DÉSACTIVÉ, puis sélectionnez Enregistrer.

    Notes

    Ces paramètres autorisent la connectivité à la base de données à partir de votre ordinateur et des applications qui s’exécutent dans Azure.

    Notes

    La désactivation de la connexion SSL est destinée à simplifier les exercices suivants. De manière générale, ce paramètre doit rester activé.

  4. Dans la fenêtre du navigateur affichant le Portail Azure avec le volet Déploiement, sélectionnez Vue d’ensemble dans le menu vertical.

  5. Dans la section Essentials, identifiez les entrées en regard des étiquettes Nom du serveur et Nom d’utilisateur administrateur et notez les valeurs.

    Notes

    Notez que le nom d’utilisateur comprend le symbole @ suivi du nom du serveur que vous avez spécifié dans la tâche précédente.

  6. Dans la fenêtre du navigateur affichant le Portail Azure avec le volet Serveur unique Azure Database pour PostgreSQL, sélectionnez Paramètres dans le menu vertical, puis Chaînes de connexion.

  7. Dans la liste des chaînes de connexion, copiez la valeur de la chaîne de connexion psql et enregistrez-la pour pouvoir l’utiliser plus tard dans cet exercice.

    Remarque

    La chaîne de connexion a la syntaxe suivante, où l’espace réservé <server_name> représente le nom du serveur que vous avez identifié précédemment dans cette tâche :

    psql "host=<server_name>.postgres.database.azure.com port=5432 dbname={your_database} user=student@<server_name> password={your_password} sslmode=require"
    
  8. Dans le Portail Azure, démarrez une session Bash sur le Cloud Shell en sélectionnant son icône dans la barre d’outils située en regard de la zone de recherche.

  9. Dans la session Bash du volet Cloud Shell, collez la valeur de la chaîne de connexion psql à partir du presse-papiers, modifiez-la pour qu’elle corresponde à la commande suivante, puis exécutez-la pour vous connecter à la base de données postgres hébergée sur l’instance de serveur Azure DataBase pour PostgreSQL récemment déployée. La valeur de l’espace réservé <server_name> sera déjà incluse dans la chaîne de connexion que vous avez collée à partir du presse-papiers :

    psql "host=<server_name>.postgres.database.azure.com port=5432 dbname=postgres user=student@<server_name>.postgres.database.azure.com password=Pa55w0rd1234 sslmode=require"
    

    Notes

    Lorsque la connexion est établie, vous recevez l’invite suivante : postgres=>.

Créer une base de données et des tables d’exemple

  1. Dans le volet Cloud Shell, à partir de l’invite Cloud Shell postgres=>, exécutez la commande suivante pour créer une nouvelle base de données nommée cnamtinventory :

    CREATE DATABASE cnamtinventory;
    
  2. Exécutez la commande suivante pour basculer la connexion vers la nouvelle base de données :

    \c cnamtinventory
    
  3. Exécutez la commande suivante pour créer une table des locataires :

    CREATE TABLE tenants (
      id bigserial PRIMARY KEY,
      name text NOT NULL,
      created_at TIMESTAMP DEFAULT NOW()::date,
      updated_at TIMESTAMP DEFAULT NOW()::date
    );
    
  4. Exécutez la commande suivante pour créer une table d’inventaire :

    CREATE TABLE inventory (
    id bigserial, 
    tenant_id bigint REFERENCES tenants (id),
    name VARCHAR(50),
    quantity INTEGER,
        date DATE NOT NULL DEFAULT NOW()::date,
        created_at TIMESTAMP DEFAULT NOW()::date,
        updated_at TIMESTAMP DEFAULT NOW()::date,
        PRIMARY KEY (tenant_id, id, date)
    ) PARTITION BY RANGE (date);
    
    CREATE TABLE inventory_default PARTITION OF inventory DEFAULT;
    

    Notes

    Les données sont partitionnées en fonction de la valeur de la colonne Date.

  5. Exécutez la commande suivante pour vérifier que la table a bien été créée :

    \dt
    
  6. Exécutez la commande suivante pour charger les exemples de données dans la table des locataires :

    INSERT INTO tenants (id, name) VALUES (1, 'adatum');
    INSERT INTO tenants (id, name) VALUES (2, 'contoso');
    
  7. Exécutez la commande suivante pour charger les exemples de données dans la table d’inventaire :

    INSERT INTO inventory (id, tenant_id, name, quantity) VALUES (1, 1, 'yogurt', 200);
    INSERT INTO inventory (id, tenant_id, name, quantity) VALUES (2, 1, 'milk', 100);
    INSERT INTO inventory (id, tenant_id, name, quantity) VALUES (1, 2, 'yogurt', 20);
    INSERT INTO inventory (id, tenant_id, name, quantity) VALUES (2, 2, 'milk', 10);
    
  8. Exécutez la commande suivante pour vérifier que la table d’inventaire contient bien les données que vous avez insérées :

    SELECT * FROM inventory;
    
  9. Fermez le volet Cloud Shell.

Intégrer le serveur Azure Database pour PostgreSQL à Microsoft Entra ID

Pour intégrer l’instance de serveur Azure Database pour PostgreSQL à Microsoft Entra ID, vous devez fournir un compte d’utilisateur Microsoft Entra en tant qu’administrateur Active Directory désigné du serveur. Vous utiliserez à cet effet le compte d’utilisateur adatumadmin1 que vous avez créé lors de la tâche précédente. Vous devez vous connecter au serveur à l’aide de ce compte d’utilisateur. À ce stade, vous savez créer des utilisateurs de base de données Microsoft Entra ID et leur affecter des rôles de base de données. Vous allez utiliser les objets adatumuser1, adatumgroup1et contosouser1 Microsoft Entra que vous avez créés au cours de l’exercice précédent.

  1. Dans la fenêtre du navigateur qui affiche le Portail Azure avec le volet Serveur Azure Database pour PostgreSQL, accédez à la section Paramètres dans le menu vertical, sélectionnez Administrateur Active Directory, puis dans la barre d’outils, sélectionnez Définir l’administrateur.

  2. Dans le volet Administrateur Active Directory, dans la liste des comptes d’utilisateurs Microsoft Entra, sélectionnez le compte d’utilisateur adatumadmin1 que vous avez créé dans l’exercice précédent, puis Sélectionner, et enfin Enregistrer.

  3. Ouvrez une autre fenêtre de navigateur web en mode Incognito/InPrivate, accédez au Portail Azureet connectez-vous à l’aide du compte d’utilisateur adatumadmin1 (avec le mot de passe Pa55w.rd1234) que vous avez créé au cours de l’exercice précédent.

  4. Dans le Portail Azure, ouvrez Cloud Shell en sélectionnant son icône dans la barre d’outils située à côté de la zone de recherche.

  5. Lorsque vous êtes invité à choisir entre Bash ou PowerShell, sélectionnez Bash, puis lorsque le message Vous n’avez aucun stockage monté apparaît, choisissez Créer un stockage.

  6. Dans la session Bash du volet Cloud Shell, exécutez les commandes suivantes pour récupérer et afficher le jeton d’accès Microsoft Entra requis pour accéder à Azure Database pour PostgreSQL :

    FULL_TOKEN=$(az account get-access-token --resource-type oss-rdbms)
    echo $FULL_TOKEN
    

    Remarque

    La commande génère une sortie qui comprend un jeton encodé en base 64, qui identifie l’utilisateur authentifié auprès de la ressource Azure Database pour PostgreSQL.

    La sortie a le format suivant :

    {
      "accessToken": "eyJ0eXAiOiJKV1QiLDJhbGciOiJSUzI1NiIsIng1dCI6Im5PbzNaRHJPRFhFSzFqS1doWHNsSFJfS1hFZyIsImtpZCI6Im5PbzNaRHJPRFhFSzFqS1doWHNsSFJfS1hFZyJ9.eyJhdWQiOiJodHRwczovL29zc3JkYm1zLWFhZC5kYXRhYmFzZS53aW5kb3dzLm5ldCIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2E2MTM5NTE0LTQxYTUtNDEyMy05ODFhLWVlN2JiOWU2YTNiNC8iLCJpYXQiOjE2MjE2MTc0NjUsIm5iZiI6MTYyMTYxNzQ2NSwiZXhwIjoxNjIxNjIxMzY0LCJhY3IiOiIxIiwiYWlvIjoiQVRRQXkvOFRBQUFBU1I5cXdVcm9KVVpmWEJabHY1NzRUenpmeGZFUlo1SXNDV3Z1aDVEOVBGWnZsL09SYWYzTGg3Zmx4NEFVaFpkVSIsImFtciI6WyJwd2QiXSwiYXBwaWQiOiJiNjc3YzI5MC1jZjRiLTRhOGUtYTYwZS05MWJhNjUwYTRhYmUiLCJhcHBpZGFjciI6IjIiLCJpcGFkZHIiOiIxNDIuMTA1LjQ4LjUxIiwibmFtZSI6ImFkYXR1bWFkbWluMSIsIm9pZCI6Ijc2ZTdmYWI5LTZiOTItNGQzZi1hOGI5LWY1NWNhNDQyYzZiMSIsInB1aWQiOiIxMDAzMjAwMTQ0RTNDMDBBIiwicmgiOiIwLkFYd0FGSlVUcHFWQkkwR1lHdTU3dWVhanRKRENkN1pMejQ1S3BnNlJ1bVVLU3I1OEFNay4iLCJzY3AiOiJ1c2VyX2ltcGVyc29uYXRpb24iLCJzdWIiOiJvNmhNMWlHXzM3MExaQk92UlpUQjBYeEdjSmpaOUVmN21lc1N2RkJYY3FFIiwidGlkIjoiYTYxMzk1MTQtNDFhNS00MTIzLTk4MWEtZWU3YmI5ZTZhM2I0IiwidW5pcXVlX25hbWUiOiJhZGF0dW1hZG1pbjFAbGl2ZWlkMjE3b3V0bG9vay5vbm1pY3Jvc29mdC5jb20iLCJ1cG4iOiJhZGF0dW1hZG1pbjFAbGl2ZWlkMjE3b3V0bG9vay5vbm1pY3Jvc29mdC5jb20iLCJ1dGkiOiJJdE81VndoU2lVV0o0UUZNQ04xQUFRIiwidmVyIjoiMS4wIn0.fFV3s2OjpVU52_SA8-atIDdkLN4onLgPmYrxa5eNCbuF0VbVOA5a9Ifv66H5a__6lMiLoV8n9EgTV4CpsLmvn6JFjAD9aHyEBkS2_iL_Rx-KCmlc7Vr6UHezrlrA3skf8oq3yb2Zqy_A3_kOrsnFgX8NP5uWoMmTzjWGTw3rOfjERJ7PowQC60nzlF1uCRDKIWw62SW4xiDQj23DSLDbkfUiG_Z9Swbw4DuMPTPeUVwz9AWhmg8lrqt5oawhKB-OMcpuwSf1-rE1cf2w54uthU6764DBEf5MVt8K95AKW0rey888znrIGKT-6yFenYUZZjL1aJ-jz8OIyNjuQK73XQ",
      "expiresOn": "2021-05-21 18:22:44.000000",
      "subscription": "d15bacf3-b17b-4ad5-a913-5fb904bd2f71",
      "tenant": "a6239514-41a5-4123-981a-ee7bb9e6a3b4",
      "tokenType": "Bearer"
    }
    
  7. Exécutez la commande suivante pour définir la valeur de la variable PGPASSWORD sur la valeur du jeton d’accès à partir de la sortie de la commande que vous avez exécutée à l’étape précédente :

    export PGPASSWORD=$(echo $FULL_TOKEN | jq -r '.accessToken')
    
  8. Exécutez la commande suivante pour vous connecter à la base de données cnamtinventory à l’aide de l’outil psql et de l’authentification Microsoft Entra (remplacez l’espace réservé <server_name> par le nom du serveur que vous avez identifié précédemment dans cet exercice) :

    DOMAIN_NAME=$(az rest --method GET --url 'https://management.azure.com/tenants?api-version=2020-01-01' --query "value[0].defaultDomain" -o tsv)
    psql "host=<server_name>.postgres.database.azure.com user=adatumadmin1@$DOMAIN_NAME@<server_name> dbname=cnamtinventory sslmode=require"
    

    Remarque

    Lorsque la connexion est établie, vous recevez l’invite suivante : cnamtinventory=>.

  9. Via l’invite cnamtinventory=>, exécutez la commande suivante pour créer un rôle de base de données correspondant au groupe Microsoft Entra adatumgroup1 que vous avez créé au cours de l’exercice précédent :

    CREATE ROLE "adatumgroup1" WITH LOGIN IN ROLE azure_ad_user;
    
  10. Exécutez la commande suivante pour vérifier que les rôles ont été créés avec succès :

    SELECT rolname FROM pg_roles;
    
  11. Exécutez la commande suivante pour accorder les autorisations SÉLECTIONNER sur la table d’inventaire au groupe adatumgroup1 que vous avez créé au cours de l’exercice précédent :

    GRANT SELECT ON inventory TO adatumgroup1;
    
  12. Déconnectez le compte d’utilisateur adatumadmin1 et fermez la fenêtre du navigateur web en mode Incognito/InPrivate.

Inscrire une application avec Microsoft Entra ID

Pour implémenter une application Node.js d’exemple utilisant l’authentification Microsoft Entra afin d’accéder à une base de données Azure Database pour PostgreSQL, vous devez créer un objet d’application Microsoft Entra et le principal de sécurité correspondant. Cela permet à l’application Node.js d’emprunter l’identité des utilisateurs Microsoft Entra lors de l’accès aux objets de base de données.

  1. Sur le portail Azure, utilisez la zone de texte Rechercher des ressources, des services et des documents pour rechercher Microsoft Entra ID, puis, dans la liste des résultats, sélectionnez Microsoft Entra ID.

  2. Dans le volet Microsoft Entra, dans la section Gérer du menu vertical, sélectionnez Inscriptions d’applications.

  3. Dans le volet Inscriptions d’applications, sélectionnez + nouvelle inscription.

  4. Dans le volet Inscrire une application, dans la zone de texte Nom, entrez cna-app. Dans la section Types de comptes pris en charge, vérifiez que l’option Comptes dans ce répertoire organisationnel uniquement (répertoire par défaut uniquement – locataire unique) est sélectionnée. Dans la section URI de redirection (facultatif), définissez l’entrée web sur http://localhost:8080/redirect, puis sélectionnez Inscrire.

    Screenshot of the Register an application blade in the Azure portal.

    Remarque

    Vous pouvez configurer la prise en charge de l’architecture multi-locataire pour vos applications Microsoft Entra inscrites. Toutefois, la couverture détaillée de cette prise en charge n’entre pas dans le cadre de ce module.

    Notes

    Une fois que vous avez déployé votre application, vous devez modifier la valeur de l’URI de redirection (facultatif) pour refléter son URL réelle.

  5. Dans le volet cna-app, passez en revue les paramètres de résultats et enregistrez les valeurs ID d’application (client) et les propriétés de l’ID de répertoire (locataire).

    Screenshot of the cna-app blade in the Azure portal.

  6. Dans le volet cna-app, sous la section Gérer, sélectionnez Certificats et secrets, puis + nouvelle clé secrète client.

  7. Dans le volet Ajouter une clé secrète client, entrez CAN-secret-0 dans la zone de texte Description. Gardez la valeur par défaut de l’entrée de la liste déroulante Expiration, puis sélectionnez Ajouter.

    Screenshot of the Add a client secret blade in the Azure portal.

  8. Revenez au volet cna-app | Certificats et secrets pour y copiez la valeur du secret que vous venez de générer.

    Remarque

    Veillez à copier la valeur du secret avant de quitter ce volet, car vous ne pourrez plus le récupérer ensuite. Si vous n’avez pas copié la valeur du secret, créez-en un autre.

    Screenshot of the value of the client secret on the cna-app Certificates & secrets blade in the Azure portal.

  9. Sur le volet cna-app | Certificats et secrets, accédez à la section Gérer dans le menu vertical et sélectionnez Autorisations d’API.

    Screenshot of the cna-app API permissions blade in the Azure portal.

  10. Dans le volet cna-app | Autorisations d’API, sélectionnez + Ajouter une autorisation. Dans le volet Demander une autorisation d’API, sélectionnez l’onglet API utilisées par mon organisation, dans la zone de recherche, entrez Azure OSSRDBMS Database, puis sélectionnez Azure OSSRDBMS Database dans la liste des résultats.

    Screenshot of the Request API permissions blade in the Azure portal.

  11. Dans le volet Demander une autorisation d’API, sélectionnez Autorisations déléguées, activez la case à cocher user_impersonation, puis sélectionnez Ajouter des autorisations.

    Screenshot of the Request API permissions blade in the Azure portal, with the Delegated permissions option selected.

  12. Revenez dans le volet cna-app | Autorisations d’API, sélectionnez Accorder le consentement de l’administrateur pour le répertoire par défaut et, quand vous êtes invité à confirmer, sélectionnez Oui.

    Screenshot of the cna-app API permissions blade in the Azure portal, with the prompt to confirm granting of the admin consent.

  13. Dans le volet cna-app | Autorisations d’API, vérifiez que les autorisations ont bien été accordées.

    Screenshot of the cna-app API permissions blade in the Azure portal, with the consent and permissions granted.

Implémenter une application Node.js simple, intégrée à Microsoft Entra

Une fois l’application inscrite dans le locataire Microsoft Entra, vous pouvez poursuivre son implémentation.

  1. Dans le portail Azure, démarrez une session Bash dans Cloud Shell en sélectionnant son icône dans la barre d’outils en regard de la zone de texte de la recherche.

  2. Dans la session Bash du volet Cloud Shell, exécutez les commandes suivantes pour initialiser un projet Node.js dans un nouveau répertoire :

    mkdir -p cna-aadexpress && cd cna-aadexpress
    npm init -y
    
  3. Exécutez les commandes suivantes pour ajouter les packages requis à la dépendance du projet :

    npm install express
    npm install pg
    npm install @azure/msal-node
    
  4. Exécutez la commande suivante pour créer un fichier nommé index.js à la racine du projet :

    touch ./index.js
    
  5. Utilisez l’éditeur nano pour ouvrir le fichier index.js et ajoutez-y le contenu suivant. Vous allez créer un nom d’application plus loin dans cette unité pour remplacer l’espace réservé <webapp_name>. Remplacez <client_id>, <tenant_id>, <client_secret> et <server_name> (à l’exclusion du suffixe .postgres.database.azure.com) par leurs valeurs réelles (celles que vous avez enregistrées précédemment dans cet exercice) :

    Remarque

    Les espaces réservés <client_id> et <tenant_id> correspondent aux propriétés ID d’application (client) et ID de répertoire (locataire) mentionnées plus tôt dans cet exercice.

    // Import dependencies
    const express = require("express");
    const msal = require('@azure/msal-node');
    const pg = require('pg');
    const port = process.env.PORT || 8080
    // Initialize express
    const app = express();
    app.use(express.json());
    app.listen(port, () => console.log(`Sample app is listening on port ${port}!`))
    
    // Authentication parameters
    const config = {
    auth: {
            clientId: "<client_id>",
            authority: "https://login.microsoftonline.com/<tenant_id>",
            clientSecret: "<client_secret>"
    },
    system: {
        loggerOptions: {
            loggerCallback(loglevel, message, containsPii) {
            console.log(message);
            },
        piiLoggingEnabled: false,
        logLevel: msal.LogLevel.Verbose,
        }
        }
    };
    
    var outputrows = ""
    
    // Initialize MSAL Node object using authentication parameters
    const cca = new msal.ConfidentialClientApplication(config);
    
    app.get('/auth', (req, res) => {
    
    redirectUri = req.hostname.toLowerCase()=="localhost" ? "http://localhost:8080/redirect" : "https://<webapp_name>.azurewebsites.net/redirect";
    
    // Construct a request object for auth code
    const authCodeUrlParameters = {
        scopes: ["https://ossrdbms-aad.database.windows.net/user_impersonation"],
        redirectUri: redirectUri,
    };
    
    // Request auth code, then redirect
    cca.getAuthCodeUrl(authCodeUrlParameters)
        .then((response) => {
            res.redirect(response);
        }).catch((error) => res.send(error));
    });
    
    app.get('/redirect', (req, res) => {
    redirectUri = req.hostname.toLowerCase()=="localhost" ? "http://localhost:8080/redirect" : "https://<webapp_name>.azurewebsites.net/redirect";
    
    // Use the auth code in redirect request to construct a token request object
    const tokenRequest = {
        code: req.query.code,
        scopes: ["https://ossrdbms-aad.database.windows.net/user_impersonation"],
        redirectUri: redirectUri,
    };
    
    // Exchange the auth code for tokens
    cca.acquireTokenByCode(tokenRequest)
    .then((response) => {
        //res.send(response);
    
        var username = 'adatumgroup1';
        var databasename = 'cnamtinventory';
        var servername = '<server_name>';
        var tablename = 'inventory';
    
        process.env.PGPASSWORD = response.accessToken;
        const connectionString =
            `postgres://${username}@${servername}@${servername}.postgres.database.azure.com:5432/${databasename}?ssl=true`;
    
        res.write(connectionString + "\n\n");
        res.write(response.accessToken + "\n\n");
    
        const client = new pg.Client(connectionString);
        client.connect(err => {
            if (err) throw err;
            else {
                queryDatabase(response.account.name);
            }
        });
    
        function queryDatabase(tenant_id) {
            console.log(`Running query to PostgreSQL server: ${servername}`);
            switch (tenant_id) {
                case "adatumuser1":
                    id = "1";
                    break;
                case "contosouser1":
                    id = "2";
                    break;
            }
            const query = `SELECT * FROM ${tablename} WHERE tenant_id = ${id};`;
            client.query(query)
            .then(qresponse => {
                const rows = qresponse.rows;
                rows.map(row => {
                    var singlerow = `${JSON.stringify(row)}`;
                    console.log(singlerow);
                    outputrows += singlerow + "\n";
                });
                res.write(outputrows);
                res.end();
                process.exit();
            })
            .catch(err => {
                 console.log(err);
            });
        }
      }).catch((error) => res.write(error));
    });
    

    Remarque

    Une application multi-locataire inscrite sur Microsoft Entra utilise l’URL d’autorité générique authority: "https://login.microsoftonline.com/common", mais dans votre cas, vous devez utiliser une URL à locataire unique contenant votre ID de locataire.

    Remarque

    Gardez à l’esprit qu’une fois l’application déployée, vous devrez remplacer la valeur de l’URL DE REDIRECTION pour qu’elle corresponde à son URL de redirection proprement dite.

  6. Utilisez l’éditeur nano pour modifier le fichier package.json à la racine du projet et remplacez-le par le contenu suivant :

    {
      "name": "node-express",
      "version": "1.0.0",
      "description": "Node.js express sample",
      "main": "index.js",
      "scripts": {
        "start": "node index.js"
      },
      "author": "",
      "license": "ISC",
      "dependencies": {
        "@azure/msal-node": "^1.1.0",
        "body-parser": "^1.19.0",
        "express": "^4.17.1",
        "http": "0.0.0",
        "morgan": "^1.10.0",
        "pg": "^8.6.0"
      }
    }
    

Valider les fonctionnalités de l’application Node.js

Vous êtes enfin prêt à tester les fonctionnalités de votre application web. Vous pourriez la conteneuriser, mais pour simplifier les choses, vous allez la déployer sur une instance Azure App Service. Cela vous permettra de valider rapidement ses fonctionnalités et de vérifier que sa conteneurisation est une option viable.

  1. Dans la session Bash du volet Cloud Shell, exécutez les commandes suivantes pour créer un groupe de ressources qui hébergera l’application web Azure dans laquelle vous déploierez l’application Next.js Express :

    RG1NAME=postgresql-db-RG
    LOCATION=$(az group show --resource-group $RG1NAME --query location --output tsv)
    RG2NAME=cna-aadexpress-RG
    az group create --name $RG2NAME --location $LOCATION
    
  2. Exécutez les commandes suivantes pour créer un plan Azure App Service de gratuit qui hébergera la nouvelle application web Azure :

    SPNAME=aadexpress-sp
    az appservice plan create --name $SPNAME --resource-group $RG2NAME --sku F1 --is-linux
    
  3. Exécutez les commandes suivantes pour créer une application web Azure Node.js :

    WEBAPPNAME=aadexpress$RANDOM$RANDOM
    az webapp create --name $WEBAPPNAME --resource-group $RG2NAME --plan $SPNAME --runtime "NODE|16-lts"
    
  4. Exécutez les commandes suivantes pour identifier le nom de l’application web :

    echo $WEBAPPNAME
    
  5. Utilisez l’éditeur nano pour ouvrir le fichier index.js, remplacez deux espaces réservés <webapp_name> par le nom que vous avez identifié à l’étape précédente, enregistrez vos modifications, puis fermez le fichier.

    Remarque

    Veillez à remplacer les deux espaces réservés <webapp_name>.

  6. Ouvrez un autre onglet dans la fenêtre du navigateur Web qui affiche le Portail Azure, accédez au Portail Azure et, si vous y êtes invité, connectez-vous pour accéder à l’abonnement Azure que vous utilisez dans ce module.

  7. Sur le portail Azure, utilisez la zone de texte Rechercher des ressources, des services et des documents pour rechercher Microsoft Entra ID, puis, dans la liste des résultats, sélectionnez Microsoft Entra ID.

  8. Dans le volet Microsoft Entra, accédez à Inscriptions d’applications, sélectionnez l’entrée cna-app, dans la section Gérer dans le menu vertical, sélectionnez Authentification.

  9. Dans le volet cna-app | Authentification, modifiez la valeur de l’URI de redirection pour qu’elle corresponde à l’entrée que vous avez mise à jour dans le fichier index.js et enregistrez le changement.

    Screenshot of the cna-app Authentication blade in the Azure portal.

  10. Revenez à l’onglet du navigateur web avec la session Bash sur le volet Cloud Shell et exécutez les commandes suivantes pour initialiser le référentiel Git local et valider toutes les modifications dans la branche primaire :

    cd ~/cna-aadexpress
    git config --global user.email "user1@adatum.com"
    git config --global user.name "Adatum User1"
    git init
    git add -A
    git commit -m "Initial Commit"
    
  11. Exécutez les commandes suivantes pour configurer les informations d’identification de déploiement de niveau utilisateur :

    DEPLOYMENTUSER=m06User$RANDOM
    DEPLOYMENTPASS=m06Pass$RANDOM$RANDOM
    az webapp deployment user set --user-name $DEPLOYMENTUSER --password $DEPLOYMENTPASS
    
  12. Exécutez les commandes suivantes pour identifier les informations d’identification de déploiement au niveau de l’utilisateur. Enregistrez leur valeur, vous en aurez besoin plus tard au cours de cette tâche :

    echo $DEPLOYMENTUSER
    echo $DEPLOYMENTPASS
    
  13. Exécutez les commandes suivantes pour identifier l’URL de déploiement de l’application web Azure que vous utiliserez comme cible de la commande git push :

    RG2NAME=cna-aadexpress-RG
    WEBAPPNAME=$(az webapp list --resource-group $RG2NAME --query "[0].name" --output tsv)
    DEPLOYMENTURL=$(az webapp deployment source config-local-git --name $WEBAPPNAME --resource-group $RG2NAME --output tsv)
    
  14. Exécutez la commande suivante pour configurer le dépôt distant nommé azure, qui représente l’URL de déploiement que vous avez identifiée à l’étape précédente :

    git remote add azure $DEPLOYMENTURL
    
  15. Exécutez les commandes suivantes pour créer la branche test basée sur la branche primaire et envoyer son contenu à l’application web Azure (lorsque vous êtes invité à entrer le mot de passe qui fait partie des informations d’identification de déploiement au niveau de l’utilisateur que vous avez enregistrées précédemment dans cette tâche) :

    git checkout -b test
    git commit -a -m "testing"
    git push --set-upstream azure test
    
  16. Fermez le volet Cloud Shell.

  17. Ouvrez une autre fenêtre de navigateur web en mode Incognito/InPrivate, accédez au Portail Azureet connectez-vous à l’aide du compte d’utilisateur adatumuser1 que vous avez créé au cours de l’exercice précédent.

  18. Dans le Portail Azure, utilisez la zone de texte Rechercher des ressources, des services et des documents en haut de la page du Portail Azure pour rechercher App Services.

  19. Dans le volet App Services, dans la liste des instances App Service, sélectionnez l’entrée représentant l’application web Azure qui vient d’être déployée.

  20. Dans la section Essentials du volet qui affiche les propriétés de l’application web, copiez la valeur de l’URL de Domaine par défaut.

  21. Ouvrez un autre onglet dans la même fenêtre de navigateur et, dans la zone de recherche, saisissez https://, collez l’URL que vous venez de copier dans le presse-papiers, ajoutez le suffixe /auth, puis appuyez sur entrée :

    Remarque

    L’URL doit avoir le format suivant : https://<webapp_name>.azurewebsites.net/auth

  22. Vérifiez que la page web résultante se compose des informations d’authentification Microsoft Entra pour l’utilisateur actuellement connecté (la sortie peut être différente).

    Screenshot of the page of the Node.js web app displaying the Microsoft Entra authentication information.

Résultats

Félicitations ! Vous avez terminé le deuxième exercice de ce module. Dans cet exercice, vous avez installé Azure Database pour PostgreSQL dans le modèle de déploiement à serveur unique, créé une base de données avec des exemples de données d’inventaire, intégré le serveur à Microsoft Entra ID et implémenté une application simple Node.js qui interroge la base de données en se basant sur l’authentification Microsoft Entra.