Cvičení – implementace víceklientských dat

Dokončeno

Toto cvičení vás provede procesem:

  • Instalace Služby Azure Database for PostgreSQL v modelu nasazení serveru
  • Vytvoření databáze s ukázkovými daty inventáře
  • Integrace serveru s Microsoft Entra ID.
  • Implementace jednoduché aplikace založené na Node.js, která dotazuje databázi tím, že spoléhá na ověřování Microsoft Entra.

Poznámka:

Toto cvičení znázorňuje zjednodušený přístup k poskytování podpory více tenantů emulací víceklientské funkčnosti modelu nasazení Hyperscale pro Azure Database for PostgreSQL. Poskytuje také zjednodušený přístup k implementaci ověřování Microsoft Entra ve scénářích s více tenanty tím, že spoléhá na funkce Microsoft Entra B2B. Microsoft Entra ID přímo podporuje víceklientských aplikací, ale jejich podrobné pokrytí je mimo rozsah tohoto modulu.

V tomto cvičení:

  • Vytvořte instanci serveru Azure Database for PostgreSQL.
  • Připojení k serveru Azure Database for PostgreSQL.
  • Vytvořte databázi a ukázkové tabulky.
  • Integrujte server Azure Database for PostgreSQL s ID Microsoft Entra.
  • Registrace aplikace pomocí Microsoft Entra ID.
  • Implementujte jednoduchou aplikaci založenou na Microsoft Entra integrated Node.js.
  • Ověřte funkčnost aplikace založené na Node.js.

Požadavky

K provedení tohoto cvičení budete potřebovat:

  • Předplatné Azure.
  • Účet Microsoft nebo účet Microsoft Entra s rolí Globální Správa istrator v tenantovi Microsoft Entra přidruženém k předplatnému Azure a s rolí Vlastník nebo Přispěvatel v předplatném Azure.
  • Abyste dokončili první cvičení tohoto modulu.

Vytvoření instance serveru Azure Database for PostgreSQL

Začnete vytvořením instance serveru Azure Database for PostgreSQL:

  1. V případě potřeby spusťte webový prohlížeč, přejděte na web Azure Portal a přihlaste se, abyste získali přístup k předplatnému Azure, které budete v tomto modulu používat.

  2. Pomocí textového pole Prohledat prostředky, služby a dokumenty na začátku stránky webu Azure Portal vyhledejte Službu Azure Database for PostgreSQL a v seznamu výsledků v části Služby vyberte Azure Database for PostgreSQL.

  3. V okně serverů Azure Database for PostgreSQL vyberte + Vytvořit.

  4. V okně vybrat možnost nasazení Azure Database for PostgreSQL na dlaždici Azure Database for PostgreSQL pro typ prostředku vyberte Jeden server.

  5. Vyberte Vytvořit.

  6. Na kartě Základy v okně Jednoúčelový server nakonfigurujte následující nastavení a pak vyberte Zkontrolovat a vytvořit a ponechte všechna ostatní nastavení s jejich výchozími hodnotami:

    Nastavení Konfigurace
    Předplatné Vyberte název předplatného Azure, které budete v tomto modulu používat.
    Skupina prostředků Vytvořte novou skupinu prostředků s názvem postgresql-db-RG.
    Název serveru Zadejte jedinečný název skládající se z malých písmen, číslic nebo pomlček a začněte písmenem.
    Zdroj dat Vyberte Žádná.
    Umístění Vyberte oblast Azure, která je nejblíže umístění testovacího prostředí, kde můžete vytvářet instance Azure Database for PostgreSQL.
    Verze Vyberte 11.
    Výpočty + úložiště Vyberte odkaz Konfigurovat server. V okně Konfigurovat vyberte Basic, nastavte hodnotu virtuálního jádra na 1 a Úložiště na 5 GB a pak vyberte OK.
    Uživatelské jméno správce Zadejte studenta.
    Password Zadejte Pa55w0rd1234.

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

  7. Na kartě Zkontrolovat a vytvořit v okně Jednoúčelový server vyberte Vytvořit.

  8. Počkejte na dokončení zřizování. Může to trvat asi pět minut.

    Poznámka:

    Proces zřizování automaticky vytvoří databázi s názvem postgres v rámci cílového serveru.

Připojení k serveru Azure Database for PostgreSQL

Se zřízeným serverem Azure Database for PostgreSQL se k němu připojíte pomocí nástroje psql .

  1. V okně Přehled Serveru Microsoft.PostgreSQLServer.createPostgreSqlServer vyberte Přejít k prostředku.

  2. V okně Nasazení v vertikální nabídce v části Nastavení vyberte Připojení zabezpečení.

  3. V okně zabezpečení Připojení nastavte Možnost Povolit přístup ke službám Azure na Ano, vyberte + Přidat IP adresu klienta, nastavte Vynutit připojení SSL na ZAKÁZÁNO a pak vyberte Uložit.

    Poznámka:

    Tato nastavení umožní připojení k databázi z počítače a z aplikací spuštěných v Azure.

    Poznámka:

    Zakázání vynucení SSL je určené ke zjednodušení následných cvičení. Obecně platí, že toto nastavení byste měli ponechat povolené.

  4. V okně prohlížeče zobrazující portál Azure Portal s oknem Nasazení v vertikální nabídce vyberte Přehled.

  5. V části Základy identifikujte položky vedle názvu serveru a Správa popisky uživatelského jména a poznamenejte si jejich hodnoty.

    Poznámka:

    Všimněte si, že uživatelské jméno obsahuje @ symbol následovaný názvem serveru, který jste zadali v předchozím úkolu.

  6. V okně prohlížeče zobrazující portál Azure Portal s oknem jednoúčelového serveru Azure Database for PostgreSQL vyberte ve svislé nabídce v části Nastavení řetězec Připojení ion.

  7. V seznamu připojovací řetězec zkopírujte hodnotu připojovací řetězec psql a poznamenejte si ji, abyste ji mohli použít později v tomto cvičení.

    Poznámka:

    Připojovací řetězec má následující syntaxi, kde <server_name> zástupný symbol představuje název serveru, který jste identifikovali dříve v této úloze:

    psql "host=<server_name>.postgres.database.azure.com port=5432 dbname={your_database} user=student@<server_name> password={your_password} sslmode=require"
    
  8. Na webu Azure Portal otevřete relaci Bash cloud Shellu tak, že na panelu nástrojů vedle vyhledávacího textového pole vyberete její ikonu.

  9. V relaci Bash v podokně Cloud Shell vložte hodnotu psql připojovací řetězec ze schránky, upravte ji tak, aby odpovídala následujícímu příkazu, a spusťte ji pro připojení k databázi postgres hostované na nově nasazené instanci serveru Azure Database for PostgreSQL. Hodnota zástupného symbolu <server_name> bude již zahrnuta v připojovací řetězec, kterou jste vložili ze schránky:

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

    Poznámka:

    Po úspěšném připojení se zobrazí postgres=> výzva.

Vytvoření databáze a ukázkových tabulek

  1. V podokně Cloud Shell na příkazovém postgres=> řádku spusťte následující příkaz, který vytvoří novou databázi s názvem cnamtinventory:

    CREATE DATABASE cnamtinventory;
    
  2. Spuštěním následujícího příkazu přepněte připojení k nově vytvořené databázi:

    \c cnamtinventory
    
  3. Spuštěním následujícího příkazu vytvořte tabulku tenantů:

    CREATE TABLE tenants (
      id bigserial PRIMARY KEY,
      name text NOT NULL,
      created_at TIMESTAMP DEFAULT NOW()::date,
      updated_at TIMESTAMP DEFAULT NOW()::date
    );
    
  4. Spuštěním následujícího příkazu vytvořte tabulku inventáře:

    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;
    

    Poznámka:

    Data se dělí na základě hodnoty sloupce kalendářního data.

  5. Spuštěním následujícího příkazu ověřte, že se tabulka úspěšně vytvořila:

    \dt
    
  6. Spuštěním následujícího příkazu načtěte ukázková data do tabulky tenantů:

    INSERT INTO tenants (id, name) VALUES (1, 'adatum');
    INSERT INTO tenants (id, name) VALUES (2, 'contoso');
    
  7. Spuštěním následujícího příkazu načtěte ukázková data do tabulky inventáře:

    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. Spuštěním následujícího příkazu ověřte, že tabulka inventáře obsahuje vložená data:

    SELECT * FROM inventory;
    
  9. Zavřete podokno Cloud Shellu.

Integrace serveru Azure Database for PostgreSQL s ID Microsoft Entra

Pokud chcete integrovat instanci serveru Azure Database for PostgreSQL s ID Microsoft Entra, musíte jako určený správce serveru zadat uživatelský účet Microsoft Entra. Použijete pro tento účel uživatelský účet adatumadmin1 , který jste vytvořili v předchozím úkolu. Musíte se přihlásit k serveru pomocí daného uživatelského účtu. V tomto okamžiku budete moct vytvořit uživatele databáze založené na ID Microsoft Entra a přiřadit jim databázové role. Použijete pro objekty adatumuser1, adatumgroup1 a contosouser1 Microsoft Entra, které jste vytvořili v předchozím cvičení.

  1. V okně prohlížeče zobrazující portál Azure Portal s oknem serveru Azure Database for PostgreSQL vyberte ve svislé nabídce v části Nastavení správce služby Active Directory a potom na panelu nástrojů vyberte Nastavit správce.

  2. V okně správce služby Active Directory vyberte v seznamu uživatelských účtů Microsoft Entra uživatelský účet adatumadmin1, který jste vytvořili v předchozím cvičení, vyberte Vybrat a pak vyberte Uložit.

  3. Otevřete jiné okno webového prohlížeče v režimu Incognito/InPrivate, přejděte na web Azure Portal a přihlaste se pomocí uživatelského účtu adatumadmin1 (s heslem Pa55w.rd1234 ), které jste vytvořili v předchozím cvičení.

  4. Na webu Azure Portal otevřete Cloud Shell tak, že na panelu nástrojů vedle vyhledávacího textového pole vyberete jeho ikonu.

  5. Po zobrazení výzvy k výběru Bash nebo PowerShellu vyberte Bash a po zobrazení zprávy Nemáte připojené žádné úložiště vyberte Vytvořit úložiště.

  6. Spuštěním následujících příkazů v relaci Bash v podokně Cloud Shell načtěte a zobrazte přístupový token Microsoft Entra potřebný pro přístup ke službě Azure Database for PostgreSQL:

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

    Poznámka:

    Příkaz vygeneruje výstup, který obsahuje token kódování Base 64, který identifikuje ověřeného uživatele pro prostředek Azure Database for PostgreSQL.

    Výstup používá následující formát:

    {
      "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. Spuštěním následujícího příkazu nastavte hodnotu proměnné PGPASSWORD na hodnotu přístupového tokenu z výstupu příkazu, který jste spustili v předchozím kroku:

    export PGPASSWORD=$(echo $FULL_TOKEN | jq -r '.accessToken')
    
  8. Spuštěním následujícího příkazu se připojte k databázi cnamtinventory pomocí nástroje psql a pomocí ověřování Microsoft Entra (nahraďte <server_name> zástupný symbol názvem serveru, který jste identifikovali dříve v tomto cvičení):

    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"
    

    Poznámka:

    Po úspěšném připojení by se měla zobrazit cnamtinventory=> výzva.

  9. Na příkazovém cnamtinventory=> řádku spusťte následující příkaz, který vytvoří roli databáze odpovídající skupině adatumgroup1 Microsoft Entra, kterou jste vytvořili v předchozím cvičení:

    CREATE ROLE "adatumgroup1" WITH LOGIN IN ROLE azure_ad_user;
    
  10. Spuštěním následujícího příkazu ověřte, že se role úspěšně vytvořily:

    SELECT rolname FROM pg_roles;
    
  11. Spuštěním následujícího příkazu udělte oprávnění SELECT v tabulce inventáře adatumgroup1, kterou jste vytvořili v předchozím cvičení:

    GRANT SELECT ON inventory TO adatumgroup1;
    
  12. Odhlaste se jako uživatelský účet adatumadmin1 a zavřete okno webového prohlížeče v režimu Incognito/InPrivate.

Registrace aplikace pomocí Microsoft Entra ID

Pokud chcete implementovat ukázkovou aplikaci založenou na Node.js, která pro přístup k databázi Azure Database for PostgreSQL používá ověřování Microsoft Entra, musíte vytvořit objekt aplikace Microsoft Entra a odpovídající objekt zabezpečení. To umožní aplikaci založenou na Node.js zosobnit uživatele Microsoft Entra při přístupu k databázovým objektům.

  1. Na webu Azure Portal pomocí textového pole Hledat prostředky, služby a dokumenty vyhledejte ID Microsoft Entra a v seznamu výsledků vyberte Microsoft Entra ID.

  2. V okně Microsoft Entra v vertikální nabídce v části Spravovat vyberte Registrace aplikací.

  3. V okně Registrace aplikací vyberte + Nová registrace.

  4. V okně Zaregistrovat aplikaci do textového pole Název zadejte can-app. V části Podporované typy účtů se ujistěte, že je vybraná možnost Účty v tomto adresáři organizace (pouze výchozí adresář – jeden tenant). V části Identifikátor URI přesměrování (volitelné) nastavte položku Web na http://localhost:8080/redirectpoložku a pak vyberte Zaregistrovat.

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

    Poznámka:

    Máte možnost nakonfigurovat podporu víceklientů pro vaše registrované aplikace Microsoft Entra. Podrobné pokrytí tohoto přístupu je však mimo rozsah tohoto modulu.

    Poznámka:

    Po nasazení aplikace budete muset upravit hodnotu identifikátoru URI přesměrování (volitelné) tak, aby odrážela její skutečnou adresu URL.

  5. V okně can-app zkontrolujte výsledné nastavení a poznamenejte si hodnoty ID aplikace (klienta) a vlastností ID adresáře (tenanta).

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

  6. V okně can-app v části Spravovat vyberte Certifikáty a tajné kódy a vyberte + Nový tajný klíč klienta.

  7. V okně Přidat tajný klíč klienta do textového pole Popis zadejte can-secret-0. Ponechte položku rozevíracího seznamu Konec platnosti s výchozí hodnotou a vyberte Přidat.

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

  8. Zpět na aplikaci can-app | Okno Certifikáty a tajné kódy zkopírujte hodnotu nově generovaného tajného kódu.

    Poznámka:

    Před přechodem z tohoto okna nezapomeňte zkopírovat hodnotu tajného kódu, protože v tomto okamžiku ji už nebudete moct načíst. V takovém případě vytvořte další tajný kód.

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

  9. V aplikaci can-app | V okně Certifikáty a tajné kódy v vertikální nabídce v části Spravovat vyberte oprávnění rozhraní API.

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

  10. V aplikaci can-app | Okno Oprávnění rozhraní API, vyberte + Přidat oprávnění, v okně Požádat o oprávnění rozhraní API vyberte rozhraní API, která moje organizace používá, ve vyhledávacím textovém poli zadejte databázi Azure OSSRDBMS a potom v seznamu výsledků vyberte databázi Azure OSSRDBMS.

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

  11. V okně Požádat o oprávnění rozhraní API vyberte Delegovaná oprávnění, zaškrtněte políčko user_impersonation a pak vyberte Přidat oprávnění.

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

  12. Zpět na aplikaci can-app | Okno Oprávnění rozhraní API, vyberte Udělit souhlas správce pro výchozí adresář a po zobrazení výzvy k potvrzení vyberte Ano.

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

  13. V aplikaci can-app | Okno Oprávnění rozhraní API ověřte, že byla udělena oprávnění.

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

Implementace jednoduché aplikace založené na Microsoft Entra integrated Node.js

S aplikací zaregistrovanou v tenantovi Microsoft Entra teď můžete pokračovat v implementaci.

  1. Na webu Azure Portal spusťte relaci Bash v Cloud Shellu tak, že na panelu nástrojů vedle vyhledávacího textového pole vyberete její ikonu.

  2. V relaci Bash v podokně Cloud Shell spusťte následující příkazy, které inicializují projekt Node.js v novém adresáři:

    mkdir -p cna-aadexpress && cd cna-aadexpress
    npm init -y
    
  3. Spuštěním následujících příkazů přidejte požadované balíčky do závislosti projektu:

    npm install express
    npm install pg
    npm install @azure/msal-node
    
  4. Spuštěním následujícího příkazu vytvořte soubor s názvem index.js v kořenovém adresáři projektu:

    touch ./index.js
    
  5. Pomocí editoru nano otevřete soubor index.js a přidejte následující obsah. Později v této lekci vytvoříte název aplikace, který nahradí zástupný symbol <webapp_name>. Nahraďte <client_id>, <tenant_id>, <client_secret>a <server_name> (s výjimkou .postgres.database.azure.com přípony) skutečnými hodnotami, které jste si poznamenali dříve v tomto cvičení:

    Poznámka:

    Zástupné symboly <client_id> a <tenant_id> odpovídají ID aplikace (klienta) a vlastnostem ID adresáře (tenanta) odkazovaným dříve v tomto cvičení.

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

    Poznámka:

    Víceklientský zaregistrovaný aplikace Microsoft Entra používá obecnou adresu URL authority: "https://login.microsoftonline.com/common"autority, ale v případě potřeby musíte použít adresu URL s jedním tenantem, která obsahuje ID vašeho tenanta.

    Poznámka:

    Mějte na paměti, že po nasazení aplikace budete muset nahradit hodnotu adresy URL REDIRECT její skutečnou adresou URL pro přesměrování.

  6. Pomocí editoru nano upravte soubor package.json v kořenovém adresáři projektu a nahraďte ho následujícím obsahem:

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

Ověření funkčnosti aplikace založené na Node.js

Konečně jste připraveni otestovat funkčnost vaší webové aplikace. I když byste ji mohli kontejnerizovat kvůli jednoduchosti, nasadíte ji do služby Aplikace Azure Service. Tím získáte rychlý způsob, jak ověřit jeho funkčnost a zajistit, aby kontejnerizace byla proveditelnou možností.

  1. V relaci Bash v podokně Cloud Shell spusťte následující příkazy a vytvořte skupinu prostředků, která bude hostovat webovou aplikaci Azure, do které nasadíte aplikaci Node.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. Spuštěním následujících příkazů vytvořte plán služby Aplikace Azure úrovně Free, který bude hostovat novou webovou aplikaci Azure:

    SPNAME=aadexpress-sp
    az appservice plan create --name $SPNAME --resource-group $RG2NAME --sku F1 --is-linux
    
  3. Spuštěním následujících příkazů vytvořte novou webovou aplikaci Azure založenou na Node.js:

    WEBAPPNAME=aadexpress$RANDOM$RANDOM
    az webapp create --name $WEBAPPNAME --resource-group $RG2NAME --plan $SPNAME --runtime "NODE|16-lts"
    
  4. Spuštěním následujících příkazů identifikujte název webové aplikace:

    echo $WEBAPPNAME
    
  5. Pomocí editoru nano otevřete soubor index.js , nahraďte dva <webapp_name> zástupné symboly názvem, který jste identifikovali v předchozím kroku, uložte změny a zavřete soubor.

    Poznámka:

    Nezapomeňte nahradit oba <webapp_name> zástupné symboly.

  6. Otevřete další kartu v okně webového prohlížeče s webem Azure Portal, přejděte na web Azure Portal a v případě výzvy se přihlaste, abyste získali přístup k předplatnému Azure, které budete v tomto modulu používat.

  7. Na webu Azure Portal pomocí textového pole Hledat prostředky, služby a dokumenty vyhledejte ID Microsoft Entra a v seznamu výsledků vyberte Microsoft Entra ID.

  8. V okně Microsoft Entra přejděte do okna Registrace aplikací, vyberte položku can-app, ve svislé nabídce v části Spravovat vyberte Ověřování.

  9. V aplikaci can-app | Okno Ověřování , upravte hodnotu identifikátoru URI přesměrování tak, aby odpovídala položce, kterou jste aktualizovali v souboru index.js , a uložte změnu.

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

  10. Přepněte zpět na kartu webového prohlížeče zobrazující relaci Bash v podokně Cloud Shell a spuštěním následujících příkazů inicializujete místní úložiště Git a potvrdíte všechny změny v hlavní větvi:

    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. Spuštěním následujících příkazů nastavte přihlašovací údaje nasazení na úrovni uživatele:

    DEPLOYMENTUSER=m06User$RANDOM
    DEPLOYMENTPASS=m06Pass$RANDOM$RANDOM
    az webapp deployment user set --user-name $DEPLOYMENTUSER --password $DEPLOYMENTPASS
    
  12. Spuštěním následujících příkazů identifikujte přihlašovací údaje nasazení na úrovni uživatele a poznamenejte si jejich hodnotu, protože je budete potřebovat později v této úloze:

    echo $DEPLOYMENTUSER
    echo $DEPLOYMENTPASS
    
  13. Spuštěním následujících příkazů identifikujte adresu URL nasazení webové aplikace Azure, kterou použijete jako cíl git push příkazu:

    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. Spuštěním následujícího příkazu nakonfigurujte vzdálené úložiště s názvem Azure, které představuje adresu URL nasazení, kterou jste identifikovali v předchozím kroku:

    git remote add azure $DEPLOYMENTURL
    
  15. Spuštěním následujících příkazů vytvořte testovací větev založenou na hlavní větvi a odešlete její obsah do webové aplikace Azure (po zobrazení výzvy k zadání hesla, které je součástí přihlašovacích údajů nasazení na úrovni uživatele, které jste si poznamenali dříve v této úloze):

    git checkout -b test
    git commit -a -m "testing"
    git push --set-upstream azure test
    
  16. Zavřete podokno Cloud Shellu.

  17. V režimu Incognito/InPrivate otevřete další okno webového prohlížeče, přejděte na web Azure Portal a přihlaste se pomocí uživatelského účtu adatumuser1 , který jste vytvořili v předchozím cvičení.

  18. Na webu Azure Portal pomocí textového pole Hledat prostředky, služby a dokumenty na začátku stránky webu Azure Portal vyhledejte App Services.

  19. V okně App Services v seznamu instancí služby App Service vyberte položku představující nově nasazenou webovou aplikaci Azure.

  20. V okně zobrazující vlastnosti webové aplikace zkopírujte v části Základy hodnotu výchozí adresy URL domény .

  21. Otevřete další kartu ve stejném okně prohlížeče a do vyhledávacího pole, zadejte https://, vložte adresu URL, kterou jste právě zkopírovali do schránky, přidejte příponu /auth a vyberte Enter.

    Poznámka:

    Adresa URL by měla mít následující formát: https://<webapp_name>.azurewebsites.net/auth

  22. Ověřte, že se výsledná webová stránka skládá z ověřovacích informací Microsoft Entra pro aktuálně přihlášeného uživatele (výstup se může lišit).

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

Výsledky

Blahopřejeme! Dokončili jste druhé cvičení tohoto modulu. V tomto cvičení jste nainstalovali Azure Database for PostgreSQL do modelu nasazení s jedním serverem, vytvořili databázi s ukázkovými daty inventáře, integrovali server s Microsoft Entra ID a implementovali jednoduchou aplikaci založenou na Node.js, která dotazuje databázi tím, že spoléhá na ověřování Microsoft Entra.