Exercício - Implementar dados multilocatários

Concluído

Este exercício leva-o através do processo de:

  • Instalando o Banco de Dados do Azure para PostgreSQL no modelo de implantação de servidor.
  • Criação de um banco de dados com dados de inventário de exemplo.
  • Integração do servidor com o Microsoft Entra ID.
  • Implementação de um aplicativo simples baseado em nó.js que consulta o banco de dados confiando na autenticação do Microsoft Entra.

Nota

Este exercício ilustra uma abordagem simplificada para fornecer suporte a vários locatários emulando a funcionalidade de multilocação do Banco de Dados do Azure para o modelo de implantação de Hiperescala PostgreSQL. Ele também fornece uma abordagem simplificada para implementar a autenticação do Microsoft Entra em cenários multilocatários, confiando na funcionalidade B2B do Microsoft Entra. O Microsoft Entra ID suporta diretamente aplicativos multilocatário, mas sua cobertura detalhada está fora do escopo deste módulo.

Neste exercício, irá:

  • Crie uma instância do Banco de Dados do Azure para o servidor PostgreSQL.
  • Conecte-se ao Banco de Dados do Azure para servidor PostgreSQL.
  • Crie um banco de dados e tabelas de exemplo.
  • Integre o Banco de Dados do Azure para o servidor PostgreSQL com o Microsoft Entra ID.
  • Registe uma aplicação com o Microsoft Entra ID.
  • Implemente um aplicativo simples e integrado .js nó do Microsoft Entra.
  • Valide a funcionalidade do aplicativo baseado em nó.js.

Pré-requisitos

Para realizar este exercício, você precisará:

  • Uma subscrição do Azure.
  • Uma conta Microsoft ou uma conta Microsoft Entra com a função de Administrador Global no inquilino do Microsoft Entra associada à subscrição do Azure e com a função de Proprietário ou Colaborador na subscrição do Azure.
  • Ter concluído o primeiro exercício deste módulo.

Criar uma instância do Banco de Dados do Azure para o servidor PostgreSQL

Você começará criando uma instância do Banco de Dados do Azure para o servidor PostgreSQL:

  1. Se necessário, inicie um navegador da Web, navegue até o portal do Azure e entre para acessar a assinatura do Azure que você usará neste módulo.

  2. Use a caixa de texto Pesquisar recursos, serviços e documentos no início da página do portal do Azure para pesquisar o Banco de Dados do Azure para PostgreSQL e, na lista de resultados, na seção Serviços, selecione Banco de Dados do Azure para PostgreSQL.

  3. Na folha Banco de Dados do Azure para servidores PostgreSQL, selecione + Criar.

  4. Na folha Selecionar opção de implantação do Banco de Dados do Azure para PostgreSQL, no bloco Banco de Dados do Azure para PostgreSQL, para Tipo de recurso, selecione Servidor único.

  5. Selecione Criar.

  6. Na guia Noções básicas da folha Servidor único, defina as seguintes configurações e selecione Revisar + criar, deixando todas as outras configurações com seus valores padrão:

    Definição Configuração
    Subscrição Selecione o nome da assinatura do Azure que você usará neste módulo.
    Grupo de recursos Crie um novo grupo de recursos chamado postgresql-db-RG.
    Nome do servidor Insira um nome exclusivo que consista em letras minúsculas, dígitos ou traços e comece com uma letra.
    Data source Selecione Nenhuma.
    Localização Selecione a região do Azure mais próxima do local do seu ambiente de laboratório onde você pode criar o Banco de Dados do Azure para instâncias do PostgreSQL.
    Versão Selecione 11.
    Computação + armazenamento Selecione o link Configurar servidor . Na folha Configurar, selecione Básico, defina o valor vCore como 1 e Armazenamento como 5 GB e selecione OK.
    Nome de utilizador de administrador Digite estudante.
    Palavra-passe Digite Pa55w0rd1234.

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

  7. Na guia Revisão + criação da folha Servidor único, selecione Criar.

  8. Aguarde a conclusão do provisionamento. Isto pode demorar cerca de cinco minutos.

    Nota

    O processo de provisionamento cria automaticamente um banco de dados chamado postgres no servidor de destino.

Conectar-se ao Banco de Dados do Azure para servidor PostgreSQL

Com o Banco de Dados do Azure para servidor PostgreSQL provisionado, você se conectará a ele usando a ferramenta psql .

  1. Na folha Microsoft.PostgreSQLServer.createPostgreSqlServer Overview (Visão geral do Microsoft.PostgreSQLServer.createPostgreSqlServer), selecione Ir para o recurso.

  2. Na folha Implantação, no menu vertical, na seção Configurações, selecione Segurança da conexão.

  3. Na folha Segurança da conexão, defina Permitir acesso aos serviços do Azure como Sim, selecione + Adicionar IP do cliente, defina Impor conexão SSL como DESABILITADO e selecione Salvar.

    Nota

    Essas configurações permitirão a conectividade com o banco de dados do seu computador e de aplicativos em execução no Azure.

    Nota

    A desativação da aplicação SSL destina-se a simplificar os exercícios subsequentes. Em geral, você deve manter essa configuração ativada.

  4. Na janela do navegador que exibe o portal do Azure com a folha Implantação , no menu vertical, selecione Visão geral.

  5. Na seção Essenciais, identifique as entradas ao lado dos rótulos Nome do servidor e Nome de usuário Admin e registre seus valores.

    Nota

    Observe que o nome de usuário inclui o @ símbolo seguido pelo nome do servidor especificado na tarefa anterior.

  6. Na janela do navegador que exibe o portal do Azure com a folha de servidor único do Banco de Dados do Azure para PostgreSQL, no menu vertical, na seção Configurações , selecione Cadeias de conexão.

  7. Na lista de cadeias de conexão, copie o valor da cadeia de conexão psql e registre-o, para que você possa usá-lo posteriormente neste exercício.

    Nota

    A cadeia de conexão tem a seguinte sintaxe, onde o espaço reservado <server_name> representa o nome do servidor identificado anteriormente nesta tarefa:

    psql "host=<server_name>.postgres.database.azure.com port=5432 dbname={your_database} user=student@<server_name> password={your_password} sslmode=require"
    
  8. No portal do Azure, abra uma sessão Bash do Cloud Shell selecionando seu ícone na barra de ferramentas ao lado da caixa de texto de pesquisa.

  9. Na sessão Bash no painel do Cloud Shell, cole o valor da cadeia de conexão psql da área de transferência, modifique-a para que corresponda ao comando a seguir e execute-a para se conectar ao banco de dados postgres hospedado na instância de servidor recém-implantada do Banco de Dados do Azure para PostgreSQL. O valor do espaço reservado já estará incluído na cadeia de <server_name> conexão colada da área de transferência:

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

    Nota

    Quando você se conectar com êxito, o prompt será apresentado postgres=> .

Criar um banco de dados e tabelas de exemplo

  1. No painel Cloud Shell, no postgres=> prompt, execute o seguinte comando para criar um novo banco de dados chamado cnamtinventory:

    CREATE DATABASE cnamtinventory;
    
  2. Execute o seguinte comando para alternar a conexão com o banco de dados recém-criado:

    \c cnamtinventory
    
  3. Execute o seguinte comando para criar uma tabela de locatários:

    CREATE TABLE tenants (
      id bigserial PRIMARY KEY,
      name text NOT NULL,
      created_at TIMESTAMP DEFAULT NOW()::date,
      updated_at TIMESTAMP DEFAULT NOW()::date
    );
    
  4. Execute o seguinte comando para criar uma tabela de inventário:

    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;
    

    Nota

    Os dados são particionados com base no valor da coluna de data.

  5. Execute o seguinte comando para verificar se a tabela foi criada com êxito:

    \dt
    
  6. Execute o seguinte comando para carregar dados de exemplo na tabela de locatários:

    INSERT INTO tenants (id, name) VALUES (1, 'adatum');
    INSERT INTO tenants (id, name) VALUES (2, 'contoso');
    
  7. Execute o seguinte comando para carregar dados de exemplo na tabela de inventário:

    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. Execute o seguinte comando para verificar se a tabela de inventário contém os dados inseridos:

    SELECT * FROM inventory;
    
  9. Feche o painel do Cloud Shell .

Integrar o Banco de Dados do Azure para o servidor PostgreSQL com a ID do Microsoft Entra

Para integrar a instância do servidor do Banco de Dados do Azure para PostgreSQL com a ID do Microsoft Entra, você deve fornecer uma conta de usuário do Microsoft Entra como o administrador designado do Ative Directory do servidor. Você usará para este fim a conta de usuário adatumadmin1 que você criou na tarefa anterior. Você precisa entrar no servidor usando essa conta de usuário. Nesse ponto, você poderá criar usuários de banco de dados baseados em ID do Microsoft Entra e atribuir a eles funções de banco de dados. Você usará para os objetos adatumuser1, adatumgroup1 e contosouser1 Microsoft Entra criados no exercício anterior.

  1. Na janela do navegador que exibe o portal do Azure com a folha do servidor Banco de Dados do Azure para PostgreSQL, no menu vertical, na seção Configurações, selecione Administrador do Ative Directory e, na barra de ferramentas, selecione Definir administrador.

  2. Na folha de administração do Ative Directory, na lista de contas de usuário do Microsoft Entra, selecione a conta de usuário adatumadmin1 que você criou no exercício anterior, selecione Selecionar e, em seguida, selecione Salvar.

  3. Abra outra janela do navegador da Web no modo de navegação anônima/InPrivate, navegue até o portal do Azure e entre usando a conta de usuário adatumadmin1 (com a senha Pa55w.rd1234) criada no exercício anterior.

  4. No portal do Azure, abra o Cloud Shell selecionando seu ícone na barra de ferramentas ao lado da caixa de texto de pesquisa.

  5. Quando lhe for pedido para selecionar Bash ou PowerShell, selecione Bash e, em seguida, quando lhe for apresentada a mensagem Não tem armazenamento montado, selecione Criar armazenamento.

  6. Na sessão Bash no painel Cloud Shell, execute os seguintes comandos para recuperar e exibir um token de acesso do Microsoft Entra necessário para acessar o Banco de Dados do Azure para PostgreSQL:

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

    Nota

    O comando gera uma saída que inclui um token codificado em Base 64, que identifica o usuário autenticado no recurso Banco de Dados do Azure para PostgreSQL.

    A saída usa o seguinte formato:

    {
      "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. Execute o seguinte comando para definir o valor da variável PGPASSWORD para o valor do token de acesso da saída do comando executado na etapa anterior:

    export PGPASSWORD=$(echo $FULL_TOKEN | jq -r '.accessToken')
    
  8. Execute o seguinte comando para se conectar ao banco de dados cnamtinventory usando a ferramenta psql e usando a autenticação do Microsoft Entra (substitua o espaço reservado <server_name> pelo nome do servidor identificado anteriormente neste exercício):

    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"
    

    Nota

    Quando você se conectar com êxito, o prompt deverá ser apresentado cnamtinventory=> .

  9. cnamtinventory=> No prompt, execute o seguinte comando para criar uma função de banco de dados correspondente ao grupo adatumgroup1 Microsoft Entra criado no exercício anterior:

    CREATE ROLE "adatumgroup1" WITH LOGIN IN ROLE azure_ad_user;
    
  10. Execute o seguinte comando para verificar se as funções foram criadas com êxito:

    SELECT rolname FROM pg_roles;
    
  11. Execute o seguinte comando para conceder as permissões SELECT na tabela de inventário ao adatumgroup1 criado no exercício anterior:

    GRANT SELECT ON inventory TO adatumgroup1;
    
  12. Saia como a conta de usuário adatumadmin1 e feche a janela do navegador da Web do modo de navegação anônima/InPrivate.

Registar uma aplicação com o Microsoft Entra ID

Para implementar um aplicativo baseado em nó de exemplo que usa a autenticação do Microsoft Entra para acessar um banco .js de dados do Azure para PostgreSQL, você deve criar um objeto de aplicativo Microsoft Entra e a entidade de segurança correspondente. Isso permitirá que o aplicativo baseado em nó.js represente os usuários do Microsoft Entra ao acessar objetos de banco de dados.

  1. No portal do Azure, use a caixa de texto Pesquisar recursos, serviços e documentos para pesquisar ID do Microsoft Entra e, na lista de resultados, selecione ID do Microsoft Entra.

  2. Na folha Microsoft Entra, no menu vertical, na seção Gerenciar , selecione Registros de aplicativos.

  3. Na folha Registos da aplicação, selecione + Novo registo.

  4. Na folha Registrar um aplicativo, na caixa de texto Nome, digite can-app. Na seção Tipos de conta suportados, verifique se a opção Contas somente neste diretório organizacional (Somente diretório padrão - Locatário único) está selecionada. Na seção Redirecionar URI (opcional), defina a entrada da Web como http://localhost:8080/redirecte selecione Registrar.

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

    Nota

    Você tem a opção de configurar o suporte multilocatário para seus aplicativos registrados do Microsoft Entra. No entanto, a cobertura detalhada desta abordagem está fora do âmbito deste módulo.

    Nota

    Depois de implantar seu aplicativo, você precisará modificar o valor de URI de redirecionamento (opcional) para refletir sua URL real.

  5. Na folha can-app, revise as configurações resultantes e registre os valores da ID do aplicativo (cliente) e das propriedades da ID do diretório (locatário).

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

  6. Na folha can-app, na seção Gerenciar, selecione Certificados & segredos e selecione + Novo segredo do cliente.

  7. Na folha Adicionar um segredo do cliente, na caixa de texto Descrição, digite can-secret-0. Deixe a entrada da lista suspensa Expira com seu valor padrão e selecione Adicionar.

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

  8. Voltar ao can-app | Folha Certificados & segredos , copie o valor do segredo recém-gerado.

    Nota

    Certifique-se de copiar o valor do segredo antes de navegar para fora desta lâmina, porque nesse ponto, você não será mais capaz de recuperá-lo. Se isso acontecer, crie outro segredo.

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

  9. No can-app | Folha Certificados & segredos, no menu vertical, na seção Gerenciar, selecione Permissões de API.

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

  10. No can-app | Folha de permissões de API, selecione + Adicionar uma permissão, na folha Solicitar permissão de API, selecione a guia APIs que minha organização usa, na caixa de texto de pesquisa, digite Banco de Dados OSSRDBMS do Azure e, na lista de resultados, selecione Banco de Dados OSSRDBMS do Azure.

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

  11. Na folha Solicitar permissão da API, selecione Permissões delegadas, marque a caixa de seleção user_impersonation e selecione Adicionar permissões.

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

  12. Voltar ao can-app | Folha Permissões da API, selecione Conceder consentimento de administrador para o Diretório Padrão e, quando for solicitada a confirmação, selecione Sim.

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

  13. No can-app | Folha de permissões da API, verifique se as permissões foram concedidas.

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

Implemente um aplicativo simples e integrado baseado .js nó integrado do Microsoft Entra

Com a aplicação registada no inquilino do Microsoft Entra, pode agora prosseguir com a sua implementação.

  1. No portal do Azure, inicie uma sessão Bash no Cloud Shell selecionando seu ícone na barra de ferramentas ao lado da caixa de texto de pesquisa.

  2. Na sessão Bash no painel Cloud Shell , execute os seguintes comandos para inicializar um projeto Node.js em um novo diretório:

    mkdir -p cna-aadexpress && cd cna-aadexpress
    npm init -y
    
  3. Execute os seguintes comandos para adicionar os pacotes necessários à dependência do projeto:

    npm install express
    npm install pg
    npm install @azure/msal-node
    
  4. Execute o seguinte comando para criar um arquivo chamado index.js na raiz do projeto:

    touch ./index.js
    
  5. Use o nano editor para abrir o índice de arquivos .js e adicione o seguinte conteúdo. Você criará um nome de aplicativo posteriormente nesta unidade para substituir o espaço reservado <webapp_name>. Substitua <client_id>, , <tenant_id><client_secret>e <server_name> (excluindo o sufixo.postgres.database.azure.com) por seus valores reais registrados anteriormente neste exercício:

    Nota

    Os espaços reservados <client_id> e correspondem às propriedades ID do aplicativo (cliente) e <tenant_id> ID do diretório (locatário) mencionadas anteriormente neste exercício.

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

    Nota

    Um aplicativo registrado multilocatário do Microsoft Entra usa a URL de autoridade genérica, mas, no seu caso, você precisa usar uma URL authority: "https://login.microsoftonline.com/common"de locatário único que inclua sua ID de locatário.

    Nota

    Lembre-se de que, depois de implantar o aplicativo, você precisará substituir o valor de URL de REDIRECIONAMENTO por sua URL de redirecionamento real.

  6. Use o editor nano para editar o arquivo package.json na raiz do projeto e substituí-lo pelo seguinte conteúdo:

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

Validar a funcionalidade do aplicativo baseado em nó.js

Você finalmente está pronto para testar a funcionalidade do seu aplicativo Web. Embora você possa conteinerizá-lo, por uma questão de simplicidade, você o implantará em um Serviço de Aplicativo do Azure. Isso fornecerá uma maneira rápida de validar sua funcionalidade e garantir que a conteinerização seja uma opção viável.

  1. Na sessão Bash no painel Cloud Shell, execute os seguintes comandos para criar um grupo de recursos que hospedará o aplicativo Web do Azure, no qual você implantará o aplicativo 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. Execute os seguintes comandos para criar um plano do Serviço de Aplicativo do Azure de camada gratuita que hospedará o novo aplicativo Web do Azure:

    SPNAME=aadexpress-sp
    az appservice plan create --name $SPNAME --resource-group $RG2NAME --sku F1 --is-linux
    
  3. Execute os seguintes comandos para criar o novo aplicativo Web do Azure baseado .js em Node:

    WEBAPPNAME=aadexpress$RANDOM$RANDOM
    az webapp create --name $WEBAPPNAME --resource-group $RG2NAME --plan $SPNAME --runtime "NODE|16-lts"
    
  4. Execute os seguintes comandos para identificar o nome do aplicativo Web:

    echo $WEBAPPNAME
    
  5. Use o nano editor para abrir o arquivo .js índice, substitua dois <webapp_name> espaços reservados pelo nome que você identificou na etapa anterior, salve suas alterações e feche o arquivo.

    Nota

    Certifique-se de substituir ambos os <webapp_name> espaços reservados.

  6. Abra outra guia na janela do navegador da Web exibindo o portal do Azure, navegue até o portal do Azure e, se solicitado, entre para acessar a assinatura do Azure que você usará neste módulo.

  7. No portal do Azure, use a caixa de texto Pesquisar recursos, serviços e documentos para pesquisar ID do Microsoft Entra e, na lista de resultados, selecione ID do Microsoft Entra.

  8. Na folha Microsoft Entra, navegue até a folha Registros de aplicativos, selecione a entrada can-app, no menu vertical, na seção Gerenciar, selecione Autenticação.

  9. No can-app | Folha de autenticação, modifique o valor do URI de redirecionamento para corresponder à entrada atualizada no arquivo de índice.js e salve a alteração.

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

  10. Volte para a guia do navegador da Web exibindo a sessão Bash no painel do Cloud Shell e execute os seguintes comandos para inicializar o repositório Git local e confirmar todas as alterações na ramificação principal:

    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. Execute os seguintes comandos para configurar credenciais de implantação no nível do usuário:

    DEPLOYMENTUSER=m06User$RANDOM
    DEPLOYMENTPASS=m06Pass$RANDOM$RANDOM
    az webapp deployment user set --user-name $DEPLOYMENTUSER --password $DEPLOYMENTPASS
    
  12. Execute os seguintes comandos para identificar as credenciais de implantação no nível do usuário e registrar seu valor, pois você precisará delas mais tarde nesta tarefa:

    echo $DEPLOYMENTUSER
    echo $DEPLOYMENTPASS
    
  13. Execute os seguintes comandos para identificar a URL de implantação do aplicativo Web do Azure que você usará como destino do git push comando:

    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. Execute o seguinte comando para configurar o repositório remoto chamado azure, representando a URL de implantação identificada na etapa anterior:

    git remote add azure $DEPLOYMENTURL
    
  15. Execute os seguintes comandos para criar a ramificação de teste com base na ramificação principal e enviar seu conteúdo para o aplicativo Web do Azure (quando solicitado a fornecer a senha que faz parte das credenciais de implantação no nível do usuário que você registrou anteriormente nesta tarefa):

    git checkout -b test
    git commit -a -m "testing"
    git push --set-upstream azure test
    
  16. Feche o painel do Cloud Shell .

  17. Abra outra janela do navegador da Web no modo de navegação anônima/InPrivate, navegue até o portal do Azure e entre usando a conta de usuário adatumuser1 que você criou no exercício anterior.

  18. No portal do Azure, use a caixa de texto Pesquisar recursos, serviços e documentos no início da página do portal do Azure para pesquisar Serviços de Aplicativo.

  19. Na folha Serviços de Aplicativo, na lista de instâncias do Serviço de Aplicativo, selecione a entrada que representa o aplicativo Web do Azure recém-implantado.

  20. Na folha que exibe as propriedades do aplicativo Web, na seção Essentials , copie o valor da URL de domínio padrão.

  21. Abra outra guia na mesma janela do navegador e, em sua caixa de pesquisa, digite https://, cole o URL que você acabou de copiar na área de transferência, adicione o sufixo /auth e selecione Enter.

    Nota

    O URL deve ter o seguinte formato: https://<webapp_name>.azurewebsites.net/auth

  22. Verifique se a página da Web resultante consiste nas informações de autenticação do Microsoft Entra para o usuário conectado no momento (a saída pode ser diferente).

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

Resultados

Parabéns! Você concluiu o segundo exercício deste módulo. Neste exercício, você instalou o Banco de Dados do Azure para PostgreSQL no modelo de implantação de servidor único, criou um banco de dados com dados de inventário de exemplo, integrou o servidor com a ID do Microsoft Entra e implementou um aplicativo simples baseado em nó.js que consulta o banco de dados confiando na autenticação do Microsoft Entra.