Oefening: multitenant-gegevens implementeren

Voltooid

In deze oefening doorloopt u het volgende:

  • Azure Database for PostgreSQL installeren in het serverimplementatiemodel.
  • Een database maken met voorbeeldinventarisgegevens.
  • De server integreren met Microsoft Entra-id.
  • Het implementeren van een eenvoudige Node.js-toepassing die een query uitvoert op de database door te vertrouwen op Microsoft Entra-verificatie.

Notitie

Deze oefening illustreert een vereenvoudigde benadering voor het bieden van ondersteuning voor meerdere tenants door de multitenancy-functionaliteit van het Azure Database for the PostgreSQL Hyperscale-implementatiemodel te emuleren. Het biedt ook een vereenvoudigde benadering voor het implementeren van Microsoft Entra-verificatie in scenario's met meerdere tenants door te vertrouwen op de Microsoft Entra B2B-functionaliteit. Microsoft Entra ID biedt rechtstreeks ondersteuning voor multitenant-toepassingen, maar hun gedetailleerde dekking valt buiten het bereik van deze module.

In deze oefening gaat u het volgende doen:

  • Maak een exemplaar van een Azure Database for PostgreSQL-server.
  • Verbinding maken naar de Azure Database for PostgreSQL-server.
  • Maak een database en voorbeeldtabellen.
  • Integreer de Azure Database for PostgreSQL-server met Microsoft Entra-id.
  • Een toepassing registreren bij Microsoft Entra ID.
  • Implementeer een eenvoudige, geïntegreerde Node.js-toepassing van Microsoft Entra.
  • Valideer de functionaliteit van de op Node.js gebaseerde toepassing.

Vereisten

Als u deze oefening wilt uitvoeren, hebt u het volgende nodig:

  • Een Azure-abonnement.
  • Een Microsoft-account of een Microsoft Entra-account met de rol Global Beheer istrator in de Microsoft Entra-tenant die is gekoppeld aan het Azure-abonnement en met de rol Eigenaar of Inzender in het Azure-abonnement.
  • Als u de eerste oefening van deze module wilt hebben voltooid.

Een exemplaar van een Azure Database for PostgreSQL-server maken

U begint met het maken van een exemplaar van azure Database for PostgreSQL-server:

  1. Start zo nodig een webbrowser, navigeer naar Azure Portal en meld u aan voor toegang tot het Azure-abonnement dat u in deze module gaat gebruiken.

  2. Gebruik het tekstvak Resources, services en documenten zoeken aan het begin van de Azure-portalpagina om te zoeken naar Azure Database for PostgreSQL en selecteer In de sectie Services de optie Azure Database for PostgreSQL in de lijst met resultaten.

  3. Selecteer + Maken op de blade Azure Database for PostgreSQL-servers.

  4. Selecteer op de blade Implementatieoptie Azure Database for PostgreSQL selecteren op de tegel Azure Database for PostgreSQL voor resourcetype Enkele server.

  5. Selecteer Maken.

  6. Configureer op het tabblad Basisbeginselen van de blade Enkele server de volgende instellingen en selecteer Vervolgens Controleren en maken, terwijl u alle andere instellingen met de standaardwaarden laat staan:

    Instelling Configuratie
    Abonnement Selecteer de naam van het Azure-abonnement dat u in deze module gaat gebruiken.
    Resourcegroep Maak een nieuwe resourcegroep met de naam postgresql-db-RG.
    Servernaam Voer een unieke naam in die bestaat uit kleine letters, cijfers of streepjes en begin met een letter.
    Gegevensbron Selecteer Geen.
    Locatie Selecteer de Azure-regio die zich het dichtst bij de locatie van uw testomgeving bevindt, waar u Azure Database for PostgreSQL-exemplaren kunt maken.
    Versie Selecteer 11.
    Berekening en opslag Selecteer de koppeling Server configureren. Selecteer Basic op de blade Configureren, stel de vCore-waarde in op 1 en Opslag op 5 GB en selecteer vervolgens OK.
    Gebruikersnaam van beheerder Voer de leerling/student in.
    Password Voer Pa55w0rd1234 in.

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

  7. Selecteer Maken op het tabblad Controleren en maken van de blade Eén server.

  8. Wacht totdat de inrichting is voltooid. Dit kan ongeveer vijf minuten duren.

    Notitie

    Het inrichtingsproces maakt automatisch een database met de naam postgres binnen de doelserver.

Verbinding maken naar de Azure Database for PostgreSQL-server

Wanneer de Azure Database for PostgreSQL-server is ingericht, maakt u er verbinding mee met behulp van het hulpprogramma psql .

  1. Selecteer in de blade Overzicht van Microsoft.PostgreSQLServer.createPostgreSqlServer de optie Ga naar de resource.

  2. Selecteer op de blade Implementatie, in het verticale menu, in de sectie Instellingen, Verbinding maken ionbeveiliging.

  3. Stel op de blade Verbinding maken ion-beveiliging de optie Toegang tot Azure-services toestaan in op Ja, selecteer + IP-adres van client toevoegen, stel SSL-verbinding afdwingen in op UITGESCHAKELD en selecteer Vervolgens Opslaan.

    Notitie

    Met deze instellingen kunt u verbinding maken met de database vanaf uw computer en vanuit toepassingen die worden uitgevoerd in Azure.

    Notitie

    Het uitschakelen van de SSL-afdwinging is bedoeld om de volgende oefeningen te vereenvoudigen. Over het algemeen moet u deze instelling ingeschakeld houden.

  4. Selecteer Overzicht in het browservenster waarin De Azure-portal wordt weergegeven met de blade Implementatie in het verticale menu.

  5. Identificeer in de sectie Essentials de vermeldingen naast de servernaam en Beheer gebruikersnaamlabels en noteer hun waarden.

    Notitie

    De gebruikersnaam bevat het @ symbool gevolgd door de servernaam die u in de vorige taak hebt opgegeven.

  6. Selecteer in het browservenster met de blade azure Database for PostgreSQL met één server in het verticale menu in de sectie Instellingen Verbinding maken iontekenreeksen.

  7. Kopieer in de lijst met verbindingsreeks s de waarde van de psql-verbindingsreeks en noteer deze, zodat u deze later in deze oefening kunt gebruiken.

    Notitie

    De verbindingsreeks heeft de volgende syntaxis, waarbij de <server_name> tijdelijke aanduiding de naam vertegenwoordigt van de server die u eerder in deze taak hebt geïdentificeerd:

    psql "host=<server_name>.postgres.database.azure.com port=5432 dbname={your_database} user=student@<server_name> password={your_password} sslmode=require"
    
  8. Open in Azure Portal een Bash-sessie van de Cloud Shell door het bijbehorende pictogram in de werkbalk naast het zoektekstvak te selecteren.

  9. Plak in de Bash-sessie in het deelvenster Cloud Shell de waarde van de psql-verbindingsreeks vanaf het klembord, wijzig deze zodat deze overeenkomt met de volgende opdracht en voer deze uit om verbinding te maken met de postgres-database die wordt gehost op het zojuist geïmplementeerde serverexemplementatie van Azure Database for PostgreSQL. De waarde van de <server_name> tijdelijke aanduiding wordt al opgenomen in de verbindingsreeks die u vanaf het klembord hebt geplakt:

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

    Notitie

    Wanneer u verbinding maakt, krijgt u de postgres=> prompt te zien.

Een database en voorbeeldtabellen maken

  1. Voer in het deelvenster Cloud Shell vanaf de prompt de volgende opdracht uit om een nieuwe database met de postgres=> naam cnamtinventory te maken:

    CREATE DATABASE cnamtinventory;
    
  2. Voer de volgende opdracht uit om de verbinding met de zojuist gemaakte database over te schakelen:

    \c cnamtinventory
    
  3. Voer de volgende opdracht uit om een tenanttabel te maken:

    CREATE TABLE tenants (
      id bigserial PRIMARY KEY,
      name text NOT NULL,
      created_at TIMESTAMP DEFAULT NOW()::date,
      updated_at TIMESTAMP DEFAULT NOW()::date
    );
    
  4. Voer de volgende opdracht uit om een inventaristabel te maken:

    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;
    

    Notitie

    De gegevens worden gepartitioneerd op basis van de waarde van de datumkolom.

  5. Voer de volgende opdracht uit om te controleren of de tabel is gemaakt:

    \dt
    
  6. Voer de volgende opdracht uit om voorbeeldgegevens in de tenanttabel te laden:

    INSERT INTO tenants (id, name) VALUES (1, 'adatum');
    INSERT INTO tenants (id, name) VALUES (2, 'contoso');
    
  7. Voer de volgende opdracht uit om voorbeeldgegevens in de inventaristabel te laden:

    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. Voer de volgende opdracht uit om te controleren of de inventaristabel de gegevens bevat die u hebt ingevoegd:

    SELECT * FROM inventory;
    
  9. Sluit het deelvenster Cloud Shell .

De Azure Database for PostgreSQL-server integreren met Microsoft Entra ID

Als u het Azure Database for PostgreSQL-serverexemplaren wilt integreren met Microsoft Entra ID, moet u een Microsoft Entra-gebruikersaccount opgeven als de aangewezen Active Directory-beheerder van de server. Hiervoor gebruikt u het adatumadmin1-gebruikersaccount dat u in de vorige taak hebt gemaakt. U moet zich aanmelden bij de server met dat gebruikersaccount. Op dat moment kunt u op Microsoft Entra ID gebaseerde databasegebruikers maken en aan hen databaserollen toewijzen. U gebruikt voor de adatumuser1-, adatumgroup1- en contosouser1 Microsoft Entra-objecten die u in de vorige oefening hebt gemaakt.

  1. Selecteer in het browservenster met de blade Azure Database for PostgreSQL-server in het verticale menu in de sectie Instellingen Active Directory-beheerder en selecteer vervolgens in de werkbalk De beheerder instellen.

  2. Selecteer op de blade Active Directory-beheerder in de lijst met Microsoft Entra-gebruikersaccounts het adatumadmin1-gebruikersaccount dat u in de vorige oefening hebt gemaakt, selecteer Selecteren en selecteer Vervolgens Opslaan.

  3. Open een ander browservenster in de Incognito-/InPrivate-modus, navigeer naar Azure Portal en meld u aan met het adatumadmin1-gebruikersaccount (met het wachtwoord Pa55w.rd1234 ) dat u in de vorige oefening hebt gemaakt.

  4. Open de Cloud Shell in Azure Portal door het bijbehorende pictogram in de werkbalk naast het zoekvak te selecteren.

  5. Wanneer u wordt gevraagd om Bash of PowerShell te selecteren, selecteert u Bash en selecteert u vervolgens Bash wanneer het bericht Wordt weergegeven dat er geen opslag is gekoppeld, selecteert u Opslag maken.

  6. Voer in de Bash-sessie in het deelvenster Cloud Shell de volgende opdrachten uit om een Microsoft Entra-toegangstoken op te halen en weer te geven dat is vereist voor toegang tot Azure Database for PostgreSQL:

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

    Notitie

    Met de opdracht wordt een uitvoer gegenereerd die een met Base 64 gecodeerd token bevat, waarmee de geverifieerde gebruiker wordt geïdentificeerd voor de Azure Database for PostgreSQL-resource.

    De uitvoer gebruikt de volgende indeling:

    {
      "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. Voer de volgende opdracht uit om de waarde van de PGPASSWORD-variabele in te stellen op de waarde van het toegangstoken vanuit de uitvoer van de opdracht die u in de vorige stap hebt uitgevoerd:

    export PGPASSWORD=$(echo $FULL_TOKEN | jq -r '.accessToken')
    
  8. Voer de volgende opdracht uit om verbinding te maken met de cnamtinventory-database met behulp van het hulpprogramma psql en met behulp van Microsoft Entra-verificatie (vervang de <server_name> tijdelijke aanduiding door de naam van de server die u eerder in deze oefening hebt geïdentificeerd):

    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"
    

    Notitie

    Wanneer u verbinding maakt, wordt de cnamtinventory=> prompt weergegeven.

  9. Voer vanaf de cnamtinventory=> prompt de volgende opdracht uit om een databaserol te maken die overeenkomt met de microsoft Entra-groep adatumgroup1 die u in de vorige oefening hebt gemaakt:

    CREATE ROLE "adatumgroup1" WITH LOGIN IN ROLE azure_ad_user;
    
  10. Voer de volgende opdracht uit om te controleren of de rollen zijn gemaakt:

    SELECT rolname FROM pg_roles;
    
  11. Voer de volgende opdracht uit om de SELECT-machtigingen voor de inventaristabel toe te kennen aan de adatumgroup1 die u in de vorige oefening hebt gemaakt:

    GRANT SELECT ON inventory TO adatumgroup1;
    
  12. Meld u af als het adatumadmin1-gebruikersaccount en sluit het webbrowservenster Incognito/InPrivate-modus.

Een toepassing registreren bij Microsoft Entra-id

Als u een voorbeeldtoepassing op Node.js wilt implementeren die gebruikmaakt van Microsoft Entra-verificatie voor toegang tot een Azure Database for PostgreSQL-database, moet u een Microsoft Entra-toepassingsobject en de bijbehorende beveiligingsprincipal maken. Hierdoor kan de op Node.js gebaseerde toepassing Microsoft Entra-gebruikers imiteren bij het openen van databaseobjecten.

  1. Gebruik in Azure Portal het tekstvak Zoekbronnen, services en documenten om naar Microsoft Entra-id te zoeken en selecteer Microsoft Entra-id in de lijst met resultaten.

  2. Selecteer op de blade Microsoft Entra in het verticale menu in de sectie Beheren App-registraties.

  3. Selecteer + Nieuwe registratie op de blade App-registraties.

  4. Voer op de blade Een toepassing registreren in het tekstvak Naam de can-app in. Zorg ervoor dat in de sectie Ondersteunde accounttypen alleen de optie Accounts in deze organisatiemap (alleen standaardmap - één tenant) is geselecteerd. Stel in de sectie Omleidings-URI (optioneel) de webvermelding http://localhost:8080/redirect in op en selecteer Registreren.

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

    Notitie

    U hebt de mogelijkheid om ondersteuning voor meerdere tenants te configureren voor uw geregistreerde Microsoft Entra-toepassingen. Gedetailleerde dekking van deze aanpak valt echter buiten het bereik van deze module.

    Notitie

    Nadat u uw toepassing hebt geïmplementeerd, moet u de omleidings-URI-waarde (optioneel) wijzigen om de werkelijke URL weer te geven.

  5. Controleer op de blade Can-app de resulterende instellingen en noteer de waarden van de toepassings-id (client) en de eigenschappen directory-id (tenant).

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

  6. Selecteer certificaten en geheimen op de blade Can-app in de sectie Beheren en selecteer + Nieuw clientgeheim.

  7. Voer op de blade Een clientgeheim toevoegen, in het tekstvak Beschrijving, can-secret-0 in. Laat de vervolgkeuzelijst verlopen met de standaardwaarde staan en selecteer Toevoegen.

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

  8. Terug in de can-app | Blade Certificaten en geheimen , kopieer de waarde van het zojuist gegenereerde geheim.

    Notitie

    Zorg ervoor dat u de waarde van het geheim kopieert voordat u van deze blade weg navigeert, omdat u het op dat moment niet meer kunt ophalen. Als dat gebeurt, maakt u nog een geheim.

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

  9. In de can-app | Blade Certificaten en geheimen in het verticale menu, in de sectie Beheren , selecteer API-machtigingen.

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

  10. In de can-app | Blade API-machtigingen, selecteer + Een machtiging toevoegen, selecteer op de blade Api-machtiging aanvragen de API's die mijn organisatie gebruikt, voer in het zoektekstvak Azure OSSRDBMS Database in en selecteer vervolgens Azure OSSRDBMS-database in de lijst met resultaten.

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

  11. Selecteer op de blade Api-machtigingen aanvragen gedelegeerde machtigingen, schakel het selectievakje user_impersonation in en selecteer vervolgens Machtigingen toevoegen.

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

  12. Terug in de can-app | Blade API-machtigingen , selecteer Beheerderstoestemming verlenen voor Standaardmap en selecteer Ja wanneer u om bevestiging wordt gevraagd.

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

  13. In de can-app | Blade API-machtigingen , controleer of de machtigingen zijn verleend.

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

Een eenvoudige, geïntegreerde Node.js-toepassing van Microsoft Entra implementeren

Wanneer de toepassing is geregistreerd in de Microsoft Entra-tenant, kunt u nu doorgaan met de implementatie ervan.

  1. Start in Azure Portal een Bash-sessie in Cloud Shell door het bijbehorende pictogram in de werkbalk naast het zoektekstvak te selecteren.

  2. Voer in de Bash-sessie in het deelvenster Cloud Shell de volgende opdrachten uit om een Node.js-project te initialiseren in een nieuwe map:

    mkdir -p cna-aadexpress && cd cna-aadexpress
    npm init -y
    
  3. Voer de volgende opdrachten uit om vereiste pakketten toe te voegen aan de afhankelijkheid van het project:

    npm install express
    npm install pg
    npm install @azure/msal-node
    
  4. Voer de volgende opdracht uit om een bestand met de naam index.js te maken in de hoofdmap van het project:

    touch ./index.js
    
  5. Gebruik de nano-editor om de bestandsindex.js te openen en voeg de volgende inhoud toe. U maakt later in deze les een app-naam om de tijdelijke aanduiding <webapp_name>te vervangen. Vervang <client_id>, <tenant_id>, <client_secret>en <server_name> (exclusief het .postgres.database.azure.com achtervoegsel) door de werkelijke waarden die u eerder in deze oefening hebt genoteerd:

    Notitie

    De tijdelijke aanduidingen <client_id> en <tenant_id> komen overeen met de toepassings-id (client) en de eigenschappen van de map-id (tenant) waarnaar eerder in deze oefening is verwezen.

    // 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));
    });
    

    Notitie

    Een geregistreerde Microsoft Entra-toepassing met meerdere tenants maakt gebruik van de algemene instantie-URL authority: "https://login.microsoftonline.com/common", maar in uw geval moet u een URL met één tenant gebruiken die uw tenant-id bevat.

    Notitie

    Houd er rekening mee dat u, nadat u de toepassing hebt geïmplementeerd, de waarde van de OMLEIDINGS-URL moet vervangen door de werkelijke omleidings-URL.

  6. Gebruik de nano-editor om het bestand package.json te bewerken in de hoofdmap van het project en vervang het door de volgende inhoud:

    {
      "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"
      }
    }
    

De functionaliteit van de op Node.js gebaseerde toepassing valideren

U bent klaar om de functionaliteit van uw web-app te testen. Hoewel u deze in een container kunt zetten, implementeert u deze omwille van de eenvoud in een Azure-app Service. Dit biedt een snelle manier om de functionaliteit ervan te valideren en ervoor te zorgen dat containeriseren een haalbare optie is.

  1. Voer in de Bash-sessie in het deelvenster Cloud Shell de volgende opdrachten uit om een resourcegroep te maken die als host fungeert voor de Azure-web-app, waarin u de Node.js Express-app implementeert:

    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. Voer de volgende opdrachten uit om een gratis Azure-app Service-plan te maken dat als host fungeert voor de nieuwe Azure-web-app:

    SPNAME=aadexpress-sp
    az appservice plan create --name $SPNAME --resource-group $RG2NAME --sku F1 --is-linux
    
  3. Voer de volgende opdrachten uit om de nieuwe Azure-web-app op basis van Node.js te maken:

    WEBAPPNAME=aadexpress$RANDOM$RANDOM
    az webapp create --name $WEBAPPNAME --resource-group $RG2NAME --plan $SPNAME --runtime "NODE|16-lts"
    
  4. Voer de volgende opdrachten uit om de naam van de web-app te identificeren:

    echo $WEBAPPNAME
    
  5. Gebruik de nano-editor om het bestand index.js te openen, twee <webapp_name> tijdelijke aanduidingen te vervangen door de naam die u in de vorige stap hebt geïdentificeerd, sla de wijzigingen op en sluit het bestand.

    Notitie

    Zorg ervoor dat u beide <webapp_name> tijdelijke aanduidingen vervangt.

  6. Open een ander tabblad in het browservenster met de Azure-portal, ga naar De Azure-portal en meld u, als u hierom wordt gevraagd, aan om toegang te krijgen tot het Azure-abonnement dat u in deze module gaat gebruiken.

  7. Gebruik in Azure Portal het tekstvak Resources, services en documenten zoeken om naar Microsoft Entra-id te zoeken en selecteer in de lijst met resultaten Microsoft Entra-id.

  8. Ga op de blade Microsoft Entra naar de blade App-registraties, selecteer in het verticale menu, in het verticale menu, in de sectie Beheren, verificatie.

  9. In de can-app | De blade Verificatie , wijzig de waarde van de omleidings-URI zodat deze overeenkomt met de vermelding die u in het bestand index.js hebt bijgewerkt en sla de wijziging op.

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

  10. Ga terug naar het tabblad van de webbrowser met de Bash-sessie in het deelvenster Cloud Shell en voer de volgende opdrachten uit om de lokale Git-opslagplaats te initialiseren en alle wijzigingen in de hoofdvertakking door te voeren:

    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. Voer de volgende opdrachten uit om implementatiereferenties op gebruikersniveau in te stellen:

    DEPLOYMENTUSER=m06User$RANDOM
    DEPLOYMENTPASS=m06Pass$RANDOM$RANDOM
    az webapp deployment user set --user-name $DEPLOYMENTUSER --password $DEPLOYMENTPASS
    
  12. Voer de volgende opdrachten uit om de referenties voor implementatie op gebruikersniveau te identificeren en hun waarde vast te leggen, omdat u deze later in deze taak nodig hebt:

    echo $DEPLOYMENTUSER
    echo $DEPLOYMENTPASS
    
  13. Voer de volgende opdrachten uit om de IMPLEMENTATIE-URL van de Azure-web-app te identificeren die u als doel van de git push opdracht gaat gebruiken:

    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. Voer de volgende opdracht uit om de externe opslagplaats met de naam Azure te configureren, die de implementatie-URL vertegenwoordigt die u in de vorige stap hebt geïdentificeerd:

    git remote add azure $DEPLOYMENTURL
    
  15. Voer de volgende opdrachten uit om de testvertakking te maken op basis van de hoofdvertakking en de inhoud ervan naar de Azure-web-app te pushen (wanneer u wordt gevraagd om het wachtwoord dat deel uitmaakt van de implementatiereferenties op gebruikersniveau die u eerder in deze taak hebt vastgelegd):

    git checkout -b test
    git commit -a -m "testing"
    git push --set-upstream azure test
    
  16. Sluit het deelvenster Cloud Shell .

  17. Open een ander browservenster in de Incognito-/InPrivate-modus, navigeer naar Azure Portal en meld u aan met het adatumuser1-gebruikersaccount dat u in de vorige oefening hebt gemaakt.

  18. Gebruik in Azure Portal het tekstvak Zoekbronnen, services en documenten aan het begin van de Azure-portalpagina om te zoeken naar App Services.

  19. Selecteer op de blade App Services in de lijst met App Service-exemplaren de vermelding die de zojuist geïmplementeerde Azure-web-app vertegenwoordigt.

  20. Kopieer op de blade met de eigenschappen van de web-app in de sectie Essentials de waarde van de standaarddomein-URL .

  21. Open een ander tabblad in hetzelfde browservenster en voer in het zoekvak https:// in, plak de URL die u zojuist naar het klembord hebt gekopieerd, voeg het achtervoegsel /auth toe en selecteer Enter.

    Notitie

    De URL moet de volgende indeling hebben: https://<webapp_name>.azurewebsites.net/auth

  22. Controleer of de resulterende webpagina bestaat uit de verificatiegegevens van Microsoft Entra voor de momenteel aangemelde gebruiker (de uitvoer kan verschillen).

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

Resultaten

Gefeliciteerd. U hebt de tweede oefening van deze module voltooid. In deze oefening hebt u Azure Database for PostgreSQL geïnstalleerd in het implementatiemodel met één server, een database gemaakt met voorbeeldinventarisatiegegevens, de server geïntegreerd met Microsoft Entra-id en een eenvoudige Node.js-gebaseerde toepassing geïmplementeerd die query's uitvoert op de database door te vertrouwen op Microsoft Entra-verificatie.