Latihan - Mengimplementasi data multitenant

Selesai

Latihan ini membawa Anda melalui proses:

  • Menginstal Azure Database for PostgreSQL dalam model penyebaran server.
  • Membuat database dengan data inventaris sampel.
  • Mengintegrasikan server dengan ID Microsoft Entra.
  • Menerapkan aplikasi berbasis Node.js sederhana yang mengkueri database dengan mengandalkan autentikasi Microsoft Entra.

Catatan

Latihan ini menggambarkan pendekatan sederhana untuk memberikan dukungan bagi beberapa penyewa dengan meniru kegunaan multitenansi Azure Database untuk model penyebaran PostgreSQL Hyperscale. Ini juga menyediakan pendekatan yang disederhanakan untuk menerapkan autentikasi Microsoft Entra dalam skenario multipenyewa dengan mengandalkan fungsionalitas Microsoft Entra B2B. MICROSOFT Entra ID secara langsung mendukung aplikasi multipenyewa, tetapi cakupan terperincinya berada di luar cakupan modul ini.

Dalam latihan ini, Anda akan:

  • Membuat instans server Azure Database for PostgreSQL.
  • Menyambungkan ke server Azure Database for PostgreSQL.
  • Membuat database dan sampel tabel.
  • Integrasikan server Azure Database for PostgreSQL dengan ID Microsoft Entra.
  • Daftarkan aplikasi dengan ID Microsoft Entra.
  • Terapkan aplikasi berbasis Node.js terintegrasi Microsoft Entra yang sederhana.
  • Memvalidasi kegunaan aplikasi berbasis Node.js.

Prasyarat

Untuk melakukan latihan ini, Anda memerlukan:

  • Langganan Azure.
  • Akun Microsoft atau akun Microsoft Entra dengan peran Administrator Global di penyewa Microsoft Entra yang terkait dengan langganan Azure dan dengan peran Pemilik atau Kontributor dalam langganan Azure.
  • Untuk menyelesaikan latihan pertama dalam modul ini.

Membuat instans server Azure Database for PostgreSQL

Anda memulai dengan membuat instans server Azure Database for PostgreSQL:

  1. Jika perlu, buka browser web, navigasikan ke portal Microsoft Azure dan masuk untuk mengakses langganan Azure yang akan Anda gunakan dalam modul ini.

  2. Gunakan kotak teks Cari sumber daya, layanan, dan dokumen di awal halaman portal Azure untuk mencari Azure Database for PostgreSQL, dan dalam daftar hasil, di bagian Layanan, pilih Azure Database for PostgreSQL.

  3. Pada bilah server Azure Database for PostgreSQL, pilih + Buat.

  4. Pada bilah Pilih opsi penyebaran Azure Database for PostgreSQL, pada petak peta Azure Database for PostgreSQL , untuk Jenis sumber daya pilih Server tunggal.

  5. Pilih Buat.

  6. Pada tab Dasar dari bilah Server tunggal, konfigurasikan pengaturan berikut, lalu pilih Tinjau + buat, sambil meninggalkan semua pengaturan lain dengan nilai defaultnya:

    Pengaturan Konfigurasi
    Langganan Pilih nama langganan Azure yang akan Anda gunakan dalam modul ini.
    Grup sumber daya Buat grup sumber daya baru bernama postgresql-db-RG.
    Nama server Masukkan nama unik yang terdiri dari huruf kecil, digit, atau tanda hubung, dan dimulai dengan huruf.
    Sumber data Pilih Tidak ada.
    Lokasi Pilih wilayah Azure yang paling dekat dengan lokasi lingkungan lab Anda di mana Anda dapat membuat instans Azure Database for PostgreSQL.
    Versi Pilih 11.
    Komputasi + penyimpanan Pilih tautan Konfigurasi server. Pada panel Konfigurasi, pilih Dasar, atur nilai vCore ke 1 dan Storage menjadi 5 GB, lalu pilih OKE.
    Nama pengguna admin Masukkan siswa.
    Kata sandi Masukkan Pa55w0rd1234.

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

  7. Pada tab Tinjau + buat dari panel Server tunggal, pilih Buat.

  8. Tunggu hingga proses provisi selesai. Proses ini mungkin memakan waktu sekitar lima menit.

    Catatan

    Proses provisi secara otomatis membuat database bernama postgres dalam server target.

Menyambung ke server Azure Database for PostgreSQL

Dengan Azure server Database for PostgreSQL tersedia, Anda akan terhubung ke sana dengan menggunakan alat psql.

  1. Di bilah Gambaran Umum Microsoft.PostgreSQLServer.createPostgreSqlServer, pilih Buka sumber daya.

  2. Pada bilah Penyebaran, di menu vertikal, di bagian Pengaturan, pilih keamanan Koneksi ion.

  3. Pada panel Keamanan koneksi, atur Izinkan akses ke layanan Azure ke Ya, pilih + Tambahkan IP klien, atur Terapkan koneksi SSL ke NONAKTIFKAN, lalu pilih Simpan.

    Catatan

    Pengaturan ini akan memungkinkan konektivitas ke database dari komputer Anda dan dari aplikasi yang berjalan di Azure.

    Catatan

    Menonaktifkan penegakan SSL dimaksudkan untuk menyederhanakan latihan berikutnya. Secara umum, Anda harus mengaktifkan pengaturan ini.

  4. Di dalam jendela browser yang menampilkan portal Azure dengan bilah Penyebaran, di menu vertikal, pilih Gambaran Umum.

  5. Di bagian Hal Penting, identifikasi entri di samping label Nama server dan Nama pengguna admin, lalu rekam nilainya.

    Catatan

    Perhatikan bahwa nama pengguna menyertakan simbol @, diikuti dengan nama server yang Anda tentukan di tugas sebelumnya.

  6. Dalam jendela browser yang menampilkan portal Azure dengan bilah server tunggal Azure Database for PostgreSQL, di menu vertikal, di bagian Pengaturan, pilih string Koneksi ion.

  7. Dalam daftar string koneksi, salin nilai string koneksi psql dan rekam, sehingga Anda dapat menggunakannya nanti dalam latihan ini.

    Catatan

    String koneksi memiliki sintaks berikut, di mana tempat penampung <server_name> mewakili nama server yang Anda identifikasi sebelumnya dalam tugas ini:

    psql "host=<server_name>.postgres.database.azure.com port=5432 dbname={your_database} user=student@<server_name> password={your_password} sslmode=require"
    
  8. Di portal Microsoft Azure, buka sesi Bash dari Cloud Shell dengan memilih ikon dari toolbar di samping kotak teks pencarian.

  9. Dalam sesi Bash di panel Cloud Shell, tempelkan nilai string koneksi psql dari clipboard, modifikasi agar sesuai dengan perintah berikut, dan jalankan untuk menyambungkan ke database postgres yang dihosting pada instans server Azure Database for PostgreSQL yang baru diterapkan. Nilai tempat penampung <server_name> sudah disertakan dalam string koneksi yang Anda tempel dari clipboard:

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

    Catatan

    Saat berhasil tersambung, Anda akan disajikan dengan permintaan postgres=>.

Membuat database dan tabel sampel

  1. Di panel Cloud Shell , dari postgres=> perintah , jalankan perintah berikut untuk membuat database baru bernama cnamtinventory:

    CREATE DATABASE cnamtinventory;
    
  2. Jalankan perintah berikut ini untuk mengalihkan koneksi ke database yang baru dibuat:

    \c cnamtinventory
    
  3. Jalankan perintah berikut untuk membuat tabel penyewa:

    CREATE TABLE tenants (
      id bigserial PRIMARY KEY,
      name text NOT NULL,
      created_at TIMESTAMP DEFAULT NOW()::date,
      updated_at TIMESTAMP DEFAULT NOW()::date
    );
    
  4. Jalankan perintah berikut untuk membuat tabel inventaris:

    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;
    

    Catatan

    Data dipartisi berdasarkan nilai kolom tanggal.

  5. Jalankan perintah berikut untuk memverifikasi bahwa tabel telah berhasil dibuat:

    \dt
    
  6. Jalankan perintah berikut ini untuk memuat data sampel ke dalam tabel penyewa:

    INSERT INTO tenants (id, name) VALUES (1, 'adatum');
    INSERT INTO tenants (id, name) VALUES (2, 'contoso');
    
  7. Jalankan perintah berikut ini untuk memuat data sampel ke dalam tabel inventaris:

    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. Jalankan perintah berikut ini untuk memverifikasi bahwa tabel inventaris berisi data yang Anda sisipkan:

    SELECT * FROM inventory;
    
  9. Tutup panel Cloud Shell.

Mengintegrasikan server Azure Database for PostgreSQL dengan ID Microsoft Entra

Untuk mengintegrasikan instans server Azure Database for PostgreSQL dengan ID Microsoft Entra, Anda harus menyediakan akun pengguna Microsoft Entra sebagai admin Direktori Aktif server yang ditunjuk. Anda akan menggunakan akun pengguna adatumadmin1 yang Anda buat di tugas sebelumnya untuk tujuan ini. Anda perlu masuk ke server menggunakan akun pengguna tersebut. Pada saat itu, Anda akan dapat membuat pengguna database berbasis ID Microsoft Entra dan menetapkan peran database kepada mereka. Anda akan menggunakan untuk objek Microsoft Entra adatumuser1, adatumgroup1, dan contosouser1 yang Anda buat di latihan sebelumnya.

  1. Dalam jendela browser yang menampilkan portal Microsoft Azure dengan panel server Azure Database for PostgreSQL, di menu vertikal, di bagian Pengaturan, pilih Admin Direktori Aktif, lalu di toolbar, pilih Atur admin.

  2. Pada bilah admin Direktori Aktif, dalam daftar akun pengguna Microsoft Entra, pilih akun pengguna adatumadmin1 yang Anda buat di latihan sebelumnya, pilih Pilih, lalu pilih Simpan.

  3. Buka jendela browser web lain dalam mode Samaran/InPrivate, navigasikan ke portal Microsoft Azure, dan masuk dengan menggunakan akun pengguna adatumadmin1 (dengan kata sandi Pa55w.rd1234) yang Anda buat di latihan sebelumnya.

  4. Di portal Microsoft Azure, buka Cloud Shell dengan memilih ikon dari toolbar di samping kotak teks pencarian.

  5. Ketika Anda diminta untuk memilih Bash atau PowerShell, pilih Bash, lalu ketika disajikan dengan pesan Anda tidak memiliki penyimpanan yang dipasang, pilih Buat penyimpanan.

  6. Dalam sesi Bash di panel Cloud Shell , jalankan perintah berikut untuk mengambil dan menampilkan token akses Microsoft Entra yang diperlukan untuk mengakses Azure Database for PostgreSQL:

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

    Catatan

    Perintah tersebut menghasilkan output yang menyertakan token berkode Base 64, yang mengidentifikasi pengguna terautentikasi ke sumber daya Azure Database for PostgreSQL.

    Output menggunakan format berikut:

    {
      "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. Jalankan perintah berikut untuk mengatur nilai variabel PGPASSWORD ke nilai token akses dari output perintah yang Anda jalankan di langkah sebelumnya:

    export PGPASSWORD=$(echo $FULL_TOKEN | jq -r '.accessToken')
    
  8. Jalankan perintah berikut untuk menyambungkan ke database cnamtinventory menggunakan alat psql dan dengan menggunakan autentikasi Microsoft Entra (ganti <server_name> tempat penampung dengan nama server yang Anda identifikasi sebelumnya dalam latihan ini):

    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"
    

    Catatan

    Saat berhasil tersambung, Anda akan disajikan dengan permintaan cnamtinventory=>.

  9. cnamtinventory=> Dari perintah , jalankan perintah berikut untuk membuat peran database yang sesuai dengan grup Microsoft Entra adatumgroup1 yang Anda buat di latihan sebelumnya:

    CREATE ROLE "adatumgroup1" WITH LOGIN IN ROLE azure_ad_user;
    
  10. Jalankan perintah berikut untuk memverifikasi bahwa peran telah berhasil dibuat:

    SELECT rolname FROM pg_roles;
    
  11. Jalankan perintah berikut untuk memberikan izin PILIH pada tabel inventaris ke adatumgroup1 yang Anda buat di latihan sebelumnya:

    GRANT SELECT ON inventory TO adatumgroup1;
    
  12. Keluar sebagai akun pengguna adatumadmin1, dan tutup jendela browser web mode Samaran/InPrivate.

Mendaftarkan aplikasi dengan ID Microsoft Entra

Untuk menerapkan contoh aplikasi berbasis Node.js yang menggunakan autentikasi Microsoft Entra untuk mengakses database Azure Database for PostgreSQL, Anda harus membuat objek aplikasi Microsoft Entra dan prinsip keamanan yang sesuai. Ini akan memungkinkan aplikasi berbasis Node.js untuk meniru pengguna Microsoft Entra saat mengakses objek database.

  1. Di portal Azure, gunakan kotak teks Cari sumber daya, layanan, dan dokumen untuk mencari ID Microsoft Entra, dan dalam daftar hasil, pilih ID Microsoft Entra.

  2. Pada bilah Microsoft Entra, di menu vertikal, di bagian Kelola, pilih Pendaftaran aplikasi.

  3. Pada panel Pendaftaran aplikasi, pilih + Pendaftaran baru.

  4. Pada panel Daftarkan aplikasi, di kotak teks Nama, masukkan cna-app. Di bagian Jenis akun yang didukung, pastikan bahwa opsi Akun dalam direktori organisasi ini saja (Direktori default saja - Penyewa tunggal) dipilih. Di bagian Alihkan URI (opsional), atur entri Web ke http://localhost:8080/redirect, lalu pilih Daftar.

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

    Catatan

    Anda memiliki opsi untuk mengonfigurasi dukungan multipenyewa untuk aplikasi terdaftar Microsoft Entra Anda. Namun, cakupan terperinci dari pendekatan ini berada di luar lingkup modul ini.

    Catatan

    Setelah menyebarkan aplikasi, Anda harus mengubah nilai Redirect URI (opsional) untuk mencerminkan URL aktualnya.

  5. Pada panel cna-app, tinjau pengaturan yang dihasilkan dan rekam nilai ID Aplikasi (klien) dan properti ID Direktori (penyewa).

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

  6. Pada panel cna-app, di bagian Kelola, pilih Sertifikat & rahasia lalu pilih + Rahasia klien baru.

  7. Pada panel Tambah rahasia klien, dalam kotak teks Deskripsi, masukkan cna-secret-0. Biarkan entri daftar turun Kedaluwarsa dengan nilai defaultnya, dan pilih Tambah.

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

  8. Kembali ke can-app | Bilah sertifikat & rahasia , salin nilai rahasia yang baru dibuat.

    Catatan

    Pastikan untuk menyalin nilai rahasia sebelum anda menavigasi jauh dari panel ini, karena pada saat itu, Anda tidak akan dapat mengambilnya lagi. Jika itu terjadi, buat rahasia lain.

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

  9. Di can-app | Bilah sertifikat & rahasia , di menu vertikal, di bagian Kelola , pilih izin API.

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

  10. Di panel cna-app | Izin API, pilih + Tambahkan izin, pada panel Izin API permintaan, pilih tab API yang digunakan organisasi saya, di kotak teks pencarian, masukkan Azure OSSRDBMS Database, lalu di daftar hasil, pilih Azure OSSRDBMS Database.

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

  11. Pada bilah Minta izin API, pilih Izin yang didelegasikan, pilih kotak centang user_impersonation , lalu pilih Tambahkan izin.

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

  12. Kembali ke panel cna-app | Izin API, pilih Berikan izin admin untuk Direktori Default, dan saat diminta konfirmasi, pilih Ya.

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

  13. Di panel cna-app | Izin API, verifikasi bahwa izin telah diberikan.

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

Menerapkan aplikasi berbasis Node.js terintegrasi Microsoft Entra yang sederhana

Dengan aplikasi yang terdaftar di penyewa Microsoft Entra, Anda sekarang dapat melanjutkan implementasinya.

  1. Di portal Microsoft Azure, mulai sesi Bash dalam Cloud Shell dengan memilih ikon dari toolbar di samping kotak teks pencarian.

  2. Dalam sesi Bash di panel Cloud Shell, jalankan perintah berikut ini untuk menginisialisasi proyek Node.js dalam direktori baru:

    mkdir -p cna-aadexpress && cd cna-aadexpress
    npm init -y
    
  3. Jalankan perintah berikut untuk menambahkan paket yang diperlukan ke dependensi proyek:

    npm install express
    npm install pg
    npm install @azure/msal-node
    
  4. Jalankan perintah berikut untuk membuat file index.js di akar proyek:

    touch ./index.js
    
  5. Gunakan editor nano untuk membuka file index.js dan menambahkan konten berikut. Anda akan membuat nama aplikasi nanti di unit ini untuk mengganti tempat penampung <webapp_name>. Ganti <client_id>, <tenant_id>, <client_secret>, dan <server_name> (tidak termasuk akhiran .postgres.database.azure.com ) dengan nilai aktual yang Anda rekam sebelumnya dalam latihan ini:

    Catatan

    Tempat penampung <client_id> dan <tenant_id> sesuai dengan ID Aplikasi (klien) dan properti ID Direktori (penyewa) yang dirujuk sebelumnya dalam latihan ini.

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

    Catatan

    Aplikasi terdaftar Microsoft Entra multipenyewa menggunakan URL authority: "https://login.microsoftonline.com/common"otoritas generik, tetapi dalam kasus Anda, Anda perlu menggunakan URL penyewa tunggal yang menyertakan ID penyewa Anda.

    Catatan

    Perlu diingat bahwa setelah menyebarkan aplikasi, Anda harus mengganti nilai URL PENGALIHAN dengan URL pengalihan aktualnya.

  6. Gunakan editor nano untuk mengedit file package.json di akar proyek dan ganti dengan konten berikut:

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

Memvalidasi kegunaan aplikasi berbasis Node.js

Anda akhirnya siap untuk menguji kegunaan aplikasi web Anda. Meskipun Anda dapat menampungnya, demi kesederhanaan, Anda akan menyebarkannya ke Azure App Service. Ini akan memberikan cara cepat untuk memvalidasi kegunaannya dan memastikan bahwa mengkontainerkannya adalah opsi yang layak.

  1. Di sesi Bash di panel Cloud Shell , jalankan perintah berikut untuk membuat grup sumber daya yang akan menghosting aplikasi web Azure, tempat Anda akan menyebarkan aplikasi 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. Jalankan perintah berikut untuk membuat paket Azure App Service tingkat gratis yang akan menghosting aplikasi web Azure baru:

    SPNAME=aadexpress-sp
    az appservice plan create --name $SPNAME --resource-group $RG2NAME --sku F1 --is-linux
    
  3. Jalankan perintah berikut untuk membuat aplikasi web Azure baru yang berbasis Node.js:

    WEBAPPNAME=aadexpress$RANDOM$RANDOM
    az webapp create --name $WEBAPPNAME --resource-group $RG2NAME --plan $SPNAME --runtime "NODE|16-lts"
    
  4. Jalankan perintah berikut untuk mengidentifikasi nama aplikasi web:

    echo $WEBAPPNAME
    
  5. Gunakan editor nano untuk membuka file index.js , ganti dua <webapp_name> tempat penampung dengan nama yang Anda identifikasi di langkah sebelumnya, simpan perubahan Anda, dan tutup file.

    Catatan

    Pastikan untuk mengganti kedua tempat penampung <webapp_name>.

  6. Buka tab lain di jendela browser web yang menampilkan portal Microsoft Azure, navigasi ke Portal Microsoft Azure dan, jika diminta, masuk untuk mengakses langganan Azure yang akan Anda gunakan dalam modul ini.

  7. Di portal Azure, gunakan kotak teks Cari sumber daya, layanan, dan dokumen untuk mencari ID Microsoft Entra dan, dalam daftar hasil, pilih ID Microsoft Entra.

  8. Pada bilah Microsoft Entra, navigasikan ke bilah Pendaftaran aplikasi, pilih entri can-app, di menu vertikal, di bagian Kelola, pilih Autentikasi.

  9. Di panel cna-app | Autentikasi, modifikasi nilai URI Pengalihan agar sesuai dengan entri yang Anda perbarui di file index.js dan simpan perubahannya.

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

  10. Beralih kembali ke tab browser web yang menampilkan sesi Bash di panel Cloud Shell dan jalankan perintah berikut untuk menginisialisasi repositori Git lokal dan lakukan semua perubahan di cabang utama:

    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. Jalankan perintah berikut untuk menyiapkan info masuk penyebaran tingkat pengguna:

    DEPLOYMENTUSER=m06User$RANDOM
    DEPLOYMENTPASS=m06Pass$RANDOM$RANDOM
    az webapp deployment user set --user-name $DEPLOYMENTUSER --password $DEPLOYMENTPASS
    
  12. Jalankan perintah berikut untuk mengidentifikasi info masuk penyebaran tingkat pengguna dan rekam nilainya, karena Anda akan memerlukannya nanti dalam tugas ini:

    echo $DEPLOYMENTUSER
    echo $DEPLOYMENTPASS
    
  13. Jalankan perintah berikut untuk mengidentifikasi URL penyebaran aplikasi web Azure yang akan Anda gunakan sebagai target perintah git push:

    RG2NAME=cna-aadexpress-RG
    WEBAPPNAME=$(az webapp list --resource-group $RG2NAME --query "[0].name" --output tsv)
    DEPLOYMENTURL=$(az webapp deployment source config-local-git --name $WEBAPPNAME --resource-group $RG2NAME --output tsv)
    
  14. Jalankan perintah berikut untuk mengonfigurasi repo jarak jauh bernama azure, mewakili URL penyebaran yang Anda identifikasi di langkah sebelumnya:

    git remote add azure $DEPLOYMENTURL
    
  15. Jalankan perintah berikut untuk membuat cabang pengujian berdasarkan cabang utama dan dorong kontennya ke aplikasi Azure Web (saat dimintai kata sandi yang menjadi bagian dari kredensial penyebaran tingkat pengguna yang Anda rekam sebelumnya dalam tugas ini):

    git checkout -b test
    git commit -a -m "testing"
    git push --set-upstream azure test
    
  16. Tutup panel Cloud Shell.

  17. Buka jendela browser web lain dalam mode Samaran/InPrivate, navigasikan ke portal Microsoft Azure, dan masuk dengan menggunakan akun pengguna adatumuser1 yang Anda buat di latihan sebelumnya.

  18. Di portal Azure, gunakan kotak teks Cari sumber daya, layanan, dan dokumen di awal halaman portal Azure untuk mencari App Services.

  19. Pada panel App Services, dalam daftar instans Azure App Service, pilih entri yang mewakili aplikasi web Azure yang baru diterapkan.

  20. Pada bilah yang menampilkan properti aplikasi web, di bagian Esensial , salin nilai URL domain Default.

  21. Buka tab lain di jendela browser yang sama dan di kotak pencariannya, masukkan https://, tempelkan URL yang baru saja Anda salin ke clipboard, tambahkan akhiran /auth , dan pilih Enter.

    Catatan

    URL harus memiliki format berikut: https://<webapp_name>.azurewebsites.net/auth

  22. Verifikasi bahwa halaman web yang dihasilkan terdiri dari informasi autentikasi Microsoft Entra untuk pengguna yang saat ini masuk (output mungkin berbeda).

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

Hasil

Selamat! Anda telah menyelesaikan latihan kedua modul ini. Dalam latihan ini, Anda menginstal Azure Database for PostgreSQL dalam model penyebaran server tunggal, membuat database dengan data inventaris sampel, mengintegrasikan server dengan ID Microsoft Entra, dan menerapkan aplikasi berbasis Node.js sederhana yang mengkueri database dengan mengandalkan autentikasi Microsoft Entra.