Ćwiczenie — implementowanie danych wielodostępnych

Ukończone

To ćwiczenie przeprowadzi Cię przez proces wykonywania następujących czynności:

  • Instalowanie usługi Azure Database for PostgreSQL w modelu wdrażania serwera.
  • Tworzenie bazy danych z przykładowymi danymi spisu.
  • Integrowanie serwera z identyfikatorem Entra firmy Microsoft.
  • Implementowanie prostej aplikacji opartej na języku Node.js, która wysyła zapytanie do bazy danych, korzystając z uwierzytelniania firmy Microsoft Entra.

Uwaga

W tym ćwiczeniu przedstawiono uproszczone podejście do zapewniania obsługi wielu dzierżaw przez emulowanie funkcji wielodostępności modelu wdrażania usługi Azure Database for the PostgreSQL w warstwie Hiperskala. Zapewnia również uproszczone podejście do implementowania uwierzytelniania firmy Microsoft Entra w scenariuszach wielodostępnych, korzystając z funkcji Microsoft Entra B2B. Identyfikator entra firmy Microsoft obsługuje bezpośrednio aplikacje wielodostępne, ale ich szczegółowe pokrycie wykracza poza zakres tego modułu.

W tym ćwiczeniu wykonasz następujące czynności:

  • Utwórz wystąpienie serwera usługi Azure Database for PostgreSQL.
  • Połączenie do serwera usługi Azure Database for PostgreSQL.
  • Utwórz bazę danych i przykładowe tabele.
  • Zintegruj serwer usługi Azure Database for PostgreSQL z identyfikatorem Entra firmy Microsoft.
  • Rejestrowanie aplikacji usługi Tożsamości Microsoft Entra.
  • Zaimplementuj prostą zintegrowaną aplikację platformy Node.js firmy Microsoft.
  • Zweryfikuj funkcjonalność aplikacji opartej na pliku Node.js.

Wymagania wstępne

Aby wykonać to ćwiczenie, potrzebne są następujące elementy:

  • Subskrypcja Azure.
  • Konto Microsoft lub konto Microsoft Entra z rolą Global Administracja istrator w dzierżawie Microsoft Entra skojarzonej z subskrypcją platformy Azure oraz z rolą Właściciel lub Współautor w subskrypcji platformy Azure.
  • Aby ukończyć pierwsze ćwiczenie tego modułu.

Tworzenie wystąpienia serwera usługi Azure Database for PostgreSQL

Zaczniesz od utworzenia wystąpienia serwera usługi Azure Database for PostgreSQL:

  1. W razie potrzeby uruchom przeglądarkę internetową, przejdź do witryny Azure Portal i zaloguj się, aby uzyskać dostęp do subskrypcji platformy Azure, której będziesz używać w tym module.

  2. Użyj pola tekstowego Wyszukaj zasoby, usługi i dokumenty na początku strony witryny Azure Portal, aby wyszukać usługę Azure Database for PostgreSQL, a następnie na liście wyników w sekcji Usługi wybierz pozycję Azure Database for PostgreSQL.

  3. W bloku Serwery usługi Azure Database for PostgreSQL wybierz pozycję + Utwórz.

  4. W bloku Wybierz opcję wdrażania usługi Azure Database for PostgreSQL na kafelku Azure Database for PostgreSQL w polu Typ zasobu wybierz pozycję Pojedynczy serwer.

  5. Wybierz pozycję Utwórz.

  6. Na karcie Podstawy bloku Pojedynczy serwer skonfiguruj następujące ustawienia, a następnie wybierz pozycję Przejrzyj i utwórz, pozostawiając wszystkie inne ustawienia z ich wartościami domyślnymi:

    Ustawienie Konfigurowanie
    Subskrypcja Wybierz nazwę subskrypcji platformy Azure, której będziesz używać w tym module.
    Grupa zasobów Utwórz nową grupę zasobów o nazwie postgresql-db-RG.
    Nazwa serwera Wprowadź unikatową nazwę składającą się z małych liter, cyfr lub kreski oraz zaczynając od litery.
    Źródło danych Wybierz pozycję Brak.
    Lokalizacja Wybierz region świadczenia usługi Azure najbliżej lokalizacji środowiska laboratoryjnego, w którym można utworzyć wystąpienia usługi Azure Database for PostgreSQL.
    Wersja Wybierz pozycję 11.
    Obliczenia i magazyn Wybierz link Konfiguruj serwer. W bloku Konfiguruj wybierz pozycję Podstawowa, ustaw wartość rdzenia wirtualnegona 1, a pozycję Magazyn na 5 GB, a następnie wybierz przycisk OK.
    Nazwa użytkownika administratora Wprowadź studenta.
    Password Wprowadź wartość Pa55w0rd1234.

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

  7. Na karcie Przeglądanie i tworzenie bloku Pojedynczy serwer wybierz pozycję Utwórz.

  8. Poczekaj na zakończenie aprowizacji. Może to potrwać około pięciu minut.

    Uwaga

    Proces aprowizacji automatycznie tworzy bazę danych o nazwie postgres na serwerze docelowym.

Połączenie do serwera usługi Azure Database for PostgreSQL

Po aprowizacji serwera usługi Azure Database for PostgreSQL połączysz się z nim przy użyciu narzędzia psql .

  1. W bloku Microsoft.PostgreSQLServer.createPostgreSqlServer Overview (Omówienie serwera Microsoft.PostgreSQLServer) wybierz pozycję Przejdź do zasobu.

  2. W bloku Wdrożenie w menu pionowym w sekcji Ustawienia wybierz pozycję zabezpieczenia Połączenie ion.

  3. W bloku zabezpieczeń Połączenie ion ustaw opcję Zezwalaj na dostęp do usług platformy Azure na wartość Tak, wybierz pozycję + Dodaj adres IP klienta, ustaw opcję Wymuszaj połączenie SSL na wartość WYŁĄCZONE, a następnie wybierz pozycję Zapisz.

    Uwaga

    Te ustawienia umożliwią łączność z bazą danych z komputera i z aplikacji działających na platformie Azure.

    Uwaga

    Wyłączenie wymuszania protokołu SSL ma na celu uproszczenie kolejnych ćwiczeń. Ogólnie rzecz biorąc, to ustawienie powinno być włączone.

  4. W oknie przeglądarki wyświetlającym witrynę Azure Portal z blokiem Wdrażanie w menu pionowym wybierz pozycję Przegląd.

  5. W sekcji Podstawy zidentyfikuj wpisy obok nazwy serwera i Administracja etykiety nazwy użytkownika i zapisz ich wartości.

    Uwaga

    Pamiętaj, że nazwa użytkownika zawiera @ symbol, po którym następuje nazwa serwera określona w poprzednim zadaniu.

  6. W oknie przeglądarki wyświetlającym witrynę Azure Portal z blokiem pojedynczego serwera usługi Azure Database for PostgreSQL w menu pionowym w sekcji Ustawienia wybierz pozycję ciągi Połączenie ion.

  7. Na liście parametry połączenia skopiuj wartość parametry połączenia psql i zapisz ją, aby można było jej użyć w dalszej części tego ćwiczenia.

    Uwaga

    Parametry połączenia ma następującą składnię, gdzie <server_name> symbol zastępczy reprezentuje nazwę serwera zidentyfikowanego wcześniej w tym zadaniu:

    psql "host=<server_name>.postgres.database.azure.com port=5432 dbname={your_database} user=student@<server_name> password={your_password} sslmode=require"
    
  8. W witrynie Azure Portal otwórz sesję powłoki Bash usługi Cloud Shell , wybierając jej ikonę na pasku narzędzi obok pola tekstowego wyszukiwania.

  9. W sesji powłoki Bash w okienku usługi Cloud Shell wklej wartość parametry połączenia psql ze schowka, zmodyfikuj ją tak, aby była zgodna z poniższym poleceniem, a następnie uruchom ją, aby nawiązać połączenie z bazą danych postgres hostowaną w nowo wdrożonym wystąpieniu serwera usługi Azure Database for PostgreSQL. Wartość symbolu <server_name> zastępczego zostanie już uwzględniona w parametry połączenia wklejonym ze schowka:

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

    Uwaga

    Po pomyślnym nawiązaniu połączenia zostanie wyświetlony postgres=> monit.

Tworzenie bazy danych i przykładowych tabel

  1. W okienku postgres=> usługi Cloud Shell w wierszu polecenia uruchom następujące polecenie, aby utworzyć nową bazę danych o nazwie cnamtinventory:

    CREATE DATABASE cnamtinventory;
    
  2. Uruchom następujące polecenie, aby przełączyć połączenie z nowo utworzoną bazą danych:

    \c cnamtinventory
    
  3. Uruchom następujące polecenie, aby utworzyć tabelę dzierżaw:

    CREATE TABLE tenants (
      id bigserial PRIMARY KEY,
      name text NOT NULL,
      created_at TIMESTAMP DEFAULT NOW()::date,
      updated_at TIMESTAMP DEFAULT NOW()::date
    );
    
  4. Uruchom następujące polecenie, aby utworzyć tabelę spisu:

    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;
    

    Uwaga

    Dane są partycjonowane na podstawie wartości kolumny daty.

  5. Uruchom następujące polecenie, aby sprawdzić, czy tabela została pomyślnie utworzona:

    \dt
    
  6. Uruchom następujące polecenie, aby załadować przykładowe dane do tabeli dzierżaw:

    INSERT INTO tenants (id, name) VALUES (1, 'adatum');
    INSERT INTO tenants (id, name) VALUES (2, 'contoso');
    
  7. Uruchom następujące polecenie, aby załadować przykładowe dane do tabeli spisu:

    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. Uruchom następujące polecenie, aby sprawdzić, czy tabela spisu zawiera wstawione dane:

    SELECT * FROM inventory;
    
  9. Zamknij okienko usługi Cloud Shell.

Integrowanie serwera usługi Azure Database for PostgreSQL z identyfikatorem Entra firmy Microsoft

Aby zintegrować wystąpienie serwera usługi Azure Database for PostgreSQL z identyfikatorem Entra firmy Microsoft, musisz podać konto użytkownika usługi Microsoft Entra jako wyznaczonego administratora usługi Active Directory serwera. W tym celu użyjesz konta użytkownika adatumadmin1 utworzonego w poprzednim zadaniu. Musisz zalogować się na serwerze przy użyciu tego konta użytkownika. W tym momencie będzie można utworzyć użytkowników bazy danych opartych na identyfikatorze Entra firmy Microsoft i przypisać do nich role bazy danych. Będziesz używać dla obiektów adatumuser1, adatumgroup1 i contosouser1 Microsoft Entra utworzonych w poprzednim ćwiczeniu.

  1. W oknie przeglądarki wyświetlającym witrynę Azure Portal z blokiem serwera usługi Azure Database for PostgreSQL w menu pionowym w sekcji Ustawienia wybierz pozycję Administrator usługi Active Directory, a następnie na pasku narzędzi wybierz pozycję Ustaw administratora.

  2. W bloku administratora usługi Active Directory na liście kont użytkowników usługi Microsoft Entra wybierz konto użytkownika adatumadmin1 utworzone w poprzednim ćwiczeniu, wybierz pozycję Wybierz, a następnie wybierz pozycję Zapisz.

  3. Otwórz inne okno przeglądarki internetowej w trybie Incognito/InPrivate, przejdź do witryny Azure Portal i zaloguj się przy użyciu konta użytkownika adatumadmin1 (z hasłem Pa55w.rd1234 ) utworzonym w poprzednim ćwiczeniu.

  4. W witrynie Azure Portal otwórz usługę Cloud Shell , wybierając jej ikonę na pasku narzędzi obok pola tekstowego wyszukiwania.

  5. Po wyświetleniu monitu o wybranie powłoki Bash lub programu PowerShell wybierz pozycję Bash, a następnie po wyświetleniu komunikatu Brak zainstalowanego magazynu wybierz pozycję Utwórz magazyn.

  6. W sesji powłoki Bash w okienku usługi Cloud Shell uruchom następujące polecenia, aby pobrać i wyświetlić token dostępu firmy Microsoft Entra wymagany do uzyskania dostępu do usługi Azure Database for PostgreSQL:

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

    Uwaga

    Polecenie generuje dane wyjściowe zawierające token zakodowany w formacie Base 64, który identyfikuje uwierzytelnionego użytkownika w zasobie usługi Azure Database for PostgreSQL.

    Dane wyjściowe używają następującego formatu:

    {
      "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. Uruchom następujące polecenie, aby ustawić wartość zmiennej PGPASSWORD na wartość tokenu dostępu z danych wyjściowych polecenia uruchomionego w poprzednim kroku:

    export PGPASSWORD=$(echo $FULL_TOKEN | jq -r '.accessToken')
    
  8. Uruchom następujące polecenie, aby nawiązać połączenie z bazą danych cnamtinventory przy użyciu narzędzia psql i przy użyciu uwierzytelniania Microsoft Entra (zastąp <server_name> symbol zastępczy nazwą serwera zidentyfikowanego wcześniej w tym ćwiczeniu):

    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"
    

    Uwaga

    Po pomyślnym nawiązaniu połączenia powinien zostać wyświetlony cnamtinventory=> monit.

  9. cnamtinventory=> W wierszu polecenia uruchom następujące polecenie, aby utworzyć rolę bazy danych odpowiadającą grupie adatumgroup1 firmy Microsoft Entra utworzonej w poprzednim ćwiczeniu:

    CREATE ROLE "adatumgroup1" WITH LOGIN IN ROLE azure_ad_user;
    
  10. Uruchom następujące polecenie, aby sprawdzić, czy role zostały pomyślnie utworzone:

    SELECT rolname FROM pg_roles;
    
  11. Uruchom następujące polecenie, aby udzielić uprawnień SELECT w tabeli spisudo grupy adatumgroup1 utworzonej w poprzednim ćwiczeniu:

    GRANT SELECT ON inventory TO adatumgroup1;
    
  12. Wyloguj się jako konto użytkownika adatumadmin1 i zamknij okno przeglądarki internetowej trybu Incognito/InPrivate.

Rejestrowanie aplikacji przy użyciu identyfikatora Entra firmy Microsoft

Aby zaimplementować przykładową aplikację opartą na środowisku Node.js, która używa uwierzytelniania firmy Microsoft Entra w celu uzyskania dostępu do bazy danych usługi Azure Database for PostgreSQL, należy utworzyć obiekt aplikacji Entra firmy Microsoft i odpowiedni podmiot zabezpieczeń. Umożliwi to aplikacji opartej na środowisku Node.js personifikację użytkowników firmy Microsoft Entra podczas uzyskiwania dostępu do obiektów bazy danych.

  1. W witrynie Azure Portal użyj pola tekstowego Wyszukaj zasoby, usługi i dokumenty, aby wyszukać identyfikator Entra firmy Microsoft, a następnie na liście wyników wybierz pozycję Microsoft Entra ID.

  2. W bloku Microsoft Entra w menu pionowym w sekcji Zarządzanie wybierz pozycję Rejestracje aplikacji.

  3. W bloku Rejestracje aplikacji wybierz pozycję + Nowa rejestracja.

  4. W bloku Rejestrowanie aplikacji w polu tekstowym Nazwa wprowadź can-app. W sekcji Obsługiwane typy kont upewnij się, że wybrano opcję Konta tylko w tym katalogu organizacyjnym (tylko katalog domyślny — pojedyncza dzierżawa). W sekcji Identyfikator URI przekierowania (opcjonalnie) ustaw wpis internetowy na http://localhost:8080/redirect, a następnie wybierz pozycję Zarejestruj.

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

    Uwaga

    Istnieje możliwość skonfigurowania obsługi wielodostępnej dla zarejestrowanych aplikacji firmy Microsoft. Jednak szczegółowe pokrycie tego podejścia wykracza poza zakres tego modułu.

    Uwaga

    Po wdrożeniu aplikacji należy zmodyfikować wartość Identyfikator URI przekierowania (opcjonalnie), aby odzwierciedlić jej rzeczywisty adres URL.

  5. W bloku can-app przejrzyj wynikowe ustawienia i zarejestruj wartości identyfikatora aplikacji (klienta) i właściwości identyfikatora katalogu (dzierżawy).

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

  6. W bloku can-app w sekcji Zarządzanie wybierz pozycję Certyfikaty i wpisy tajne, a następnie wybierz pozycję + Nowy wpis tajny klienta.

  7. W bloku Dodawanie wpisu tajnego klienta w polu tekstowym Opis wprowadź wartość can-secret-0. Pozostaw wpis listy rozwijanej Wygasa z wartością domyślną i wybierz pozycję Dodaj.

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

  8. Powrót do aplikacji can-app | Blok Certyfikaty i wpisy tajne skopiuj wartość nowo wygenerowanego wpisu tajnego.

    Uwaga

    Pamiętaj, aby skopiować wartość wpisu tajnego przed przejściem z tego bloku, ponieważ w tym momencie nie będzie już można go pobrać. W takim przypadku utwórz kolejny wpis tajny.

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

  9. W aplikacji can-app | Blok Certyfikaty i wpisy tajne w menu pionowym w sekcji Zarządzanie wybierz pozycję Uprawnienia interfejsu API.

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

  10. W aplikacji can-app | Blok uprawnień interfejsu API, wybierz pozycję + Dodaj uprawnienie, w bloku Uprawnienia interfejsu API żądania wybierz kartę Interfejsy API używane przez moją organizację, w polu tekstowym wyszukiwania wprowadź wartość Azure OSSRDBMS Database, a następnie na liście wyników wybierz pozycję Azure OSSRDBMS Database.

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

  11. W bloku Uprawnienia interfejsu API żądania wybierz pozycję Uprawnienia delegowane, zaznacz pole wyboru user_impersonation, a następnie wybierz pozycję Dodaj uprawnienia.

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

  12. Powrót do aplikacji can-app | W bloku Uprawnienia interfejsu API wybierz pozycję Udziel zgody administratora dla katalogu domyślnego, a po wyświetleniu monitu o potwierdzenie wybierz pozycję Tak.

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

  13. W aplikacji can-app | Blok uprawnień interfejsu API— sprawdź, czy udzielono uprawnień.

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

Implementowanie prostej, zintegrowanej aplikacji Node.js firmy Microsoft

Aplikacja zarejestrowana w dzierżawie microsoft Entra umożliwia teraz kontynuowanie jej implementacji.

  1. W witrynie Azure Portal uruchom sesję powłoki Bash w usłudze Cloud Shell , wybierając jej ikonę na pasku narzędzi obok pola tekstowego wyszukiwania.

  2. W sesji powłoki Bash w okienku usługi Cloud Shell uruchom następujące polecenia, aby zainicjować projekt Node.js w nowym katalogu:

    mkdir -p cna-aadexpress && cd cna-aadexpress
    npm init -y
    
  3. Uruchom następujące polecenia, aby dodać wymagane pakiety do zależności projektu:

    npm install express
    npm install pg
    npm install @azure/msal-node
    
  4. Uruchom następujące polecenie, aby utworzyć plik o nazwie index.js w katalogu głównym projektu:

    touch ./index.js
    
  5. Użyj edytora nano, aby otworzyć plik index.js i dodać następującą zawartość. W dalszej części tej lekcji utworzysz nazwę aplikacji, aby zastąpić symbol zastępczy <webapp_name>. Zastąp <client_id>wartości , <tenant_id>, <client_secret>i <server_name> (z wyłączeniem sufiksu .postgres.database.azure.com ) wartościami rzeczywistymi zarejestrowanymi wcześniej w tym ćwiczeniu:

    Uwaga

    Symbole <client_id> zastępcze i <tenant_id> odpowiadają identyfikatorowi aplikacji (klienta) oraz właściwościom identyfikatora katalogu (dzierżawy) przywołanych wcześniej w tym ćwiczeniu.

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

    Uwaga

    Aplikacja zarejestrowana w wielu dzierżawach firmy Microsoft używa adresu URL authority: "https://login.microsoftonline.com/common"urzędu ogólnego, ale w Twoim przypadku należy użyć adresu URL z jedną dzierżawą, który zawiera identyfikator dzierżawy.

    Uwaga

    Pamiętaj, że po wdrożeniu aplikacji należy zastąpić wartość adresu URL przekierowania rzeczywistym adresem URL przekierowania.

  6. Użyj edytora nano, aby edytować plik package.json w katalogu głównym projektu i zastąpić go następującą zawartością:

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

Weryfikowanie funkcjonalności aplikacji opartej na języku Node.js

Na koniec możesz przetestować funkcje aplikacji internetowej. Chociaż można go konteneryzować, ze względu na prostotę, wdrożysz go w usłudze aplikacja systemu Azure. Zapewni to szybki sposób weryfikacji jego funkcjonalności i upewnienia się, że konteneryzowanie jej jest opłacalną opcją.

  1. W sesji powłoki Bash w okienku usługi Cloud Shell uruchom następujące polecenia, aby utworzyć grupę zasobów, która będzie hostować aplikację internetową platformy Azure, w której wdrożysz aplikację 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. Uruchom następujące polecenia, aby utworzyć plan usługi aplikacja systemu Azure w warstwie Bezpłatna, który będzie hostować nową aplikację internetową platformy Azure:

    SPNAME=aadexpress-sp
    az appservice plan create --name $SPNAME --resource-group $RG2NAME --sku F1 --is-linux
    
  3. Uruchom następujące polecenia, aby utworzyć nową aplikację internetową platformy Azure opartą na języku Node.js:

    WEBAPPNAME=aadexpress$RANDOM$RANDOM
    az webapp create --name $WEBAPPNAME --resource-group $RG2NAME --plan $SPNAME --runtime "NODE|16-lts"
    
  4. Uruchom następujące polecenia, aby zidentyfikować nazwę aplikacji internetowej:

    echo $WEBAPPNAME
    
  5. Użyj edytora nano, aby otworzyć plik index.js , zastąp dwa <webapp_name> symbole zastępcze nazwą zidentyfikowaną w poprzednim kroku, zapisz zmiany i zamknij plik.

    Uwaga

    Pamiętaj, aby zastąpić oba <webapp_name> symbole zastępcze.

  6. Otwórz inną kartę w oknie przeglądarki internetowej z wyświetloną witryną Azure Portal, przejdź do witryny Azure Portal i, jeśli zostanie wyświetlony monit, zaloguj się, aby uzyskać dostęp do subskrypcji platformy Azure, której będziesz używać w tym module.

  7. W witrynie Azure Portal użyj pola tekstowego Wyszukaj zasoby, usługi i dokumenty, aby wyszukać identyfikator Entra firmy Microsoft, a następnie na liście wyników wybierz pozycję Microsoft Entra ID.

  8. W bloku Microsoft Entra przejdź do bloku Rejestracje aplikacji, wybierz wpis can-app w menu pionowym w sekcji Zarządzanie wybierz pozycję Uwierzytelnianie.

  9. W aplikacji can-app | Blok uwierzytelniania zmodyfikuj wartość identyfikatora URI przekierowania, aby był zgodny z wpisem zaktualizowanym w pliku index.js i zapisz zmianę.

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

  10. Wróć do karty przeglądarki internetowej wyświetlającej sesję powłoki Bash w okienku usługi Cloud Shell i uruchom następujące polecenia, aby zainicjować lokalne repozytorium Git i zatwierdzić wszystkie zmiany w gałęzi głównej:

    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. Uruchom następujące polecenia, aby skonfigurować poświadczenia wdrożenia na poziomie użytkownika:

    DEPLOYMENTUSER=m06User$RANDOM
    DEPLOYMENTPASS=m06Pass$RANDOM$RANDOM
    az webapp deployment user set --user-name $DEPLOYMENTUSER --password $DEPLOYMENTPASS
    
  12. Uruchom następujące polecenia, aby zidentyfikować poświadczenia wdrożenia na poziomie użytkownika i zarejestrować ich wartość, ponieważ będą one potrzebne w dalszej części tego zadania:

    echo $DEPLOYMENTUSER
    echo $DEPLOYMENTPASS
    
  13. Uruchom następujące polecenia, aby zidentyfikować adres URL wdrożenia aplikacji internetowej platformy Azure, który będzie używany jako element docelowy git push polecenia:

    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. Uruchom następujące polecenie, aby skonfigurować repozytorium zdalne o nazwie azure reprezentujące adres URL wdrożenia zidentyfikowany w poprzednim kroku:

    git remote add azure $DEPLOYMENTURL
    
  15. Uruchom następujące polecenia, aby utworzyć gałąź testową na podstawie głównej gałęzi i wypchnąć jej zawartość do aplikacji internetowej platformy Azure (po wyświetleniu monitu o hasło będące częścią poświadczeń wdrożenia na poziomie użytkownika zarejestrowanych wcześniej w tym zadaniu):

    git checkout -b test
    git commit -a -m "testing"
    git push --set-upstream azure test
    
  16. Zamknij okienko usługi Cloud Shell.

  17. Otwórz inne okno przeglądarki internetowej w trybie Incognito/InPrivate, przejdź do witryny Azure Portal i zaloguj się przy użyciu konta użytkownika adatumuser1 utworzonego w poprzednim ćwiczeniu.

  18. W witrynie Azure Portal użyj pola tekstowego Wyszukaj zasoby, usługi i dokumenty na początku strony witryny Azure Portal, aby wyszukać usługę App Services.

  19. W bloku App Services na liście wystąpień usługi App Service wybierz wpis reprezentujący nowo wdrożona aplikację internetową platformy Azure.

  20. W bloku wyświetlającym właściwości aplikacji internetowej w sekcji Podstawy skopiuj wartość domyślnego adresu URL domeny .

  21. Otwórz inną kartę w tym samym oknie przeglądarki i w polu wyszukiwania wprowadź https://, wklej właśnie skopiowany adres URL do schowka, dodaj sufiks /auth i wybierz klawisz Enter.

    Uwaga

    Adres URL powinien mieć następujący format: https://<webapp_name>.azurewebsites.net/auth

  22. Sprawdź, czy wynikowa strona internetowa składa się z informacji o uwierzytelnianiu firmy Microsoft dla aktualnie zalogowanego użytkownika (dane wyjściowe mogą się różnić).

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

Wyniki

Gratulacje! Wykonano drugie ćwiczenie tego modułu. W tym ćwiczeniu zainstalowano usługę Azure Database for PostgreSQL w modelu wdrażania pojedynczego serwera, utworzono bazę danych z przykładowymi danymi spisu, zintegrowano serwer z identyfikatorem Microsoft Entra ID i zaimplementowano prostą aplikację opartą na pliku Node.js, która wysyła zapytanie do bazy danych, korzystając z uwierzytelniania firmy Microsoft Entra.