Partilhar via


Configurar a autenticação em um aplicativo de página única de exemplo usando o Azure AD B2C

Este artigo usa um exemplo de aplicativo de página única (SPA) JavaScript para ilustrar como adicionar a autenticação do Azure Ative Directory B2C (Azure AD B2C) aos seus SPAs.

Descrição geral

OpenID Connect (OIDC) é um protocolo de autenticação que é construído em OAuth 2.0. Você pode usá-lo para conectar com segurança um usuário em um aplicativo. Este exemplo de SPA usa MSAL.js e o fluxo PKCE OIDC. MSAL.js é uma biblioteca fornecida pela Microsoft que simplifica a adição de suporte de autenticação e autorização a SPAs.

Fluxo de login

O fluxo de entrada envolve as seguintes etapas:

  1. Os utilizadores vão para a aplicação Web e selecionam Iniciar sessão.
  2. O aplicativo inicia uma solicitação de autenticação e redireciona os usuários para o Azure AD B2C.
  3. Os utilizadores registam-se ou iniciam sessão e repõem a palavra-passe. Em alternativa, podem iniciar sessão com uma conta social.
  4. Depois que os usuários entrarem, o Azure AD B2C retorna um código de autorização para o aplicativo.
  5. O aplicativo de página única valida o token de ID, lê as declarações e, por sua vez, permite que os usuários chamem recursos e APIs protegidos.

Visão geral do registro do aplicativo

Para permitir que seu aplicativo entre com o Azure AD B2C e chame uma API Web, registre dois aplicativos no diretório do Azure AD B2C.

  • O registro do aplicativo Web permite que seu aplicativo entre com o Azure AD B2C. Durante o registro, você especifica o URI de redirecionamento. O URI de redirecionamento é o ponto de extremidade para o qual os usuários são redirecionados pelo Azure AD B2C após a conclusão da autenticação com o Azure AD B2C. O processo de registro do aplicativo gera uma ID do aplicativo, também conhecida como ID do cliente, que identifica exclusivamente seu aplicativo.

  • O registro da API da Web permite que seu aplicativo chame uma API da Web segura. O registro inclui os escopos da API da Web. Os escopos fornecem uma maneira de gerenciar permissões para recursos protegidos, como sua API da Web. Você concede permissões ao aplicativo Web para os escopos da API da Web. Quando um token de acesso é solicitado, seu aplicativo especifica as permissões desejadas no parâmetro de escopo da solicitação.

A arquitetura e os registros do aplicativo são ilustrados no diagrama a seguir:

Diagrama de um aplicativo Web com registros de chamada de API da Web e tokens.

Chamada para uma API da Web

Depois que a autenticação é concluída, os usuários interagem com o aplicativo, que invoca uma API da Web protegida. A API da Web usa autenticação de token de portador. O token de portador é o token de acesso que o aplicativo obteve do Azure AD B2C. O aplicativo passa o token no cabeçalho de autorização da solicitação HTTPS.

Authorization: Bearer <access token>

Se o escopo do token de acesso não corresponder aos escopos da API da Web, a biblioteca de autenticação obterá um novo token de acesso com os escopos corretos.

Fluxo de saída

O fluxo de saída envolve as seguintes etapas:

  1. A partir da aplicação, os utilizadores terminam sessão.
  2. O aplicativo limpa seus objetos de sessão e a biblioteca de autenticação limpa seu cache de token.
  3. O aplicativo leva os usuários ao ponto de extremidade de saída do Azure AD B2C para encerrar a sessão do Azure AD B2C.
  4. Os usuários são redirecionados de volta para o aplicativo.

Pré-requisitos

Um computador que esteja executando:

Etapa 1: Configurar o fluxo de usuários

Quando os usuários tentam entrar em seu aplicativo, o aplicativo inicia uma solicitação de autenticação para o ponto de extremidade de autorização por meio de um fluxo de usuário. O fluxo do usuário define e controla a experiência do usuário. Depois que os usuários concluem o fluxo de usuários, o Azure AD B2C gera um token e, em seguida, redireciona os usuários de volta para seu aplicativo.

Se ainda não tiver feito isso, crie um fluxo de usuário ou uma política personalizada. Repita as etapas para criar três fluxos de usuário separados da seguinte maneira:

  • Um fluxo de usuário combinado de login e inscrição , como susi. Esse fluxo de usuário também suporta a experiência Esqueceu sua senha .
  • Um fluxo de usuário de edição de perfil, como edit_profile.
  • Um fluxo de usuário de redefinição de senha, como reset_password.

O Azure AD B2C precede o nome do fluxo de B2C_1_ usuário. Por exemplo, susi passa a B2C_1_susi.

Passo 2: Registe o seu SPA e API

Nesta etapa, você cria o SPA e os registros do aplicativo de API da Web e especifica os escopos da sua API da Web.

Etapa 2.1: Registrar o aplicativo de API da Web

Para criar o registro do aplicativo de API da Web (ID do aplicativo: 2), siga estas etapas:

  1. Inicie sessão no portal do Azure.

  2. Verifique se você está usando o diretório que contém seu locatário do Azure AD B2C. Selecione o ícone Diretórios + assinaturas na barra de ferramentas do portal.

  3. Nas configurações do Portal | Página Diretórios + assinaturas , localize seu diretório do Azure AD B2C na lista Nome do diretório e selecione Alternar.

  4. No portal do Azure, procure e selecione Azure AD B2C.

  5. Selecione Registos de aplicações e, em seguida, selecione Novo registo.

  6. Em Name, insira um nome para o aplicativo (por exemplo, my-api1). Deixe os valores padrão para URI de redirecionamento e tipos de conta suportados.

  7. Selecione Registar.

  8. Depois que o registro do aplicativo for concluído, selecione Visão geral.

  9. Registre o valor da ID do aplicativo (cliente) para uso posterior ao configurar o aplicativo Web.

    Captura de tela que demonstra como obter um aplicativo web A P I D.

Etapa 2.2: Configurar escopos

  1. Selecione o aplicativo my-api1 que você criou (ID do aplicativo: 2) para abrir a página Visão geral.

  2. Em Gerenciar, selecione Expor uma API.

  3. Ao lado de URI da ID do aplicativo, selecione o link Definir. Substitua o valor padrão (GUID) por um nome exclusivo (por exemplo, tasks-api) e selecione Salvar.

    Quando seu aplicativo Web solicita um token de acesso para a API da Web, ele deve adicionar esse URI como o prefixo para cada escopo que você define para a API.

  4. Em Escopos definidos por esta API, selecione Adicionar um escopo.

  5. Para criar um escopo que defina o acesso de leitura à API:

    1. Em Nome do escopo, insira tasks.read.
    2. Para Nome de exibição do consentimento do administrador, insira API de acesso de leitura às tarefas.
    3. Para Descrição do consentimento do administrador, insira Permite acesso de leitura à API de tarefas.
  6. Selecione Adicionar escopo.

  7. Selecione Adicionar um escopo e adicione um escopo que defina o acesso de gravação à API:

    1. Em Nome do escopo, insira tasks.write.
    2. Para Nome de exibição do consentimento do administrador, digite Acesso de gravação à API de tarefas.
    3. Para Descrição do consentimento do administrador, insira Permite acesso de gravação à API de tarefas.
  8. Selecione Adicionar escopo.

Passo 2.3: Registar o SPA

Para criar o registro SPA, use as seguintes etapas:

  1. Inicie sessão no portal do Azure.
  2. Se tiver acesso a vários inquilinos, selecione o ícone Definições no menu superior para mudar para o inquilino do Azure AD B2C no menu Diretórios + subscrições.
  3. Procure e selecione Azure AD B2C.
  4. Selecione Registos de aplicações e, em seguida, selecione Novo registo.
  5. Insira um Nome para o aplicativo (por exemplo, MyApp).
  6. Em Tipos de conta suportados, selecione Contas em qualquer provedor de identidade ou diretório organizacional (para autenticar usuários com fluxos de usuários).
  7. Em Redirecionar URI, selecione Aplicativo de página única (SPA) e, na caixa URL, digite http://localhost:6420.
  8. Em Permissões, marque a caixa de seleção Conceder consentimento de administrador para permissões de acesso openid e offline.
  9. Selecione Registar.

Registre o ID do aplicativo (cliente) para usar mais tarde, quando você configurar o aplicativo Web.

Captura de tela da página Visão geral do aplicativo Web para gravar o ID do aplicativo Web.

Etapa 2.4: Habilitar o fluxo de concessão implícito

Você pode habilitar o fluxo de concessão implícito por dois motivos, quando estiver usando MSAL.js versão 1.3 ou anterior ou quando usar um registro de aplicativo para testar um fluxo de usuário para fins de teste.

Use estas etapas para habilitar o fluxo de concessão implícito para seu aplicativo:

  1. Selecione o registro do aplicativo que você criou.

  2. Em Gerir, selecione Autenticação.

  3. Em Concessão implícita e fluxos híbridos, marque as caixas de seleção Tokens de acesso (usados para fluxos implícitos) e Tokens de ID (usados para fluxos implícitos e híbridos).

  4. Selecione Guardar.

Nota

Se seu aplicativo usa o MSAL.js 2.0 ou posterior, não habilite o fluxo de concessão implícito, pois o MSAL.js 2.0+ oferece suporte ao fluxo de código de autorização OAuth 2.0 (com PKCE). Se você habilitar a concessão implícita para testar um fluxo de usuário, certifique-se de desabilitar as configurações de fluxo de concessão implícita antes de implantar seu aplicativo na produção.

Etapa 2.5: Conceder permissões

Para conceder permissões ao seu aplicativo (ID do aplicativo: 1), siga estas etapas:

  1. Selecione Registos de aplicações e, em seguida, selecione a aplicação que criou (ID da aplicação: 1).

  2. Em Gerenciar, selecione Permissões de API.

  3. Em Permissões configuradas, selecione Adicionar uma permissão.

  4. Selecione a guia Minhas APIs .

  5. Selecione a API (ID do aplicativo: 2) à qual o aplicativo Web deve ter acesso. Por exemplo, digite my-api1.

  6. Em Permissão, expanda tarefas e selecione os escopos definidos anteriormente (por exemplo, tasks.read e tasks.write).

  7. Selecione Adicionar permissões.

  8. Selecione Conceder consentimento de administrador para <o nome> do seu inquilino.

  9. Selecione Yes (Sim).

  10. Selecione Atualizar e verifique se Concedido para ... aparece em Status para ambos os escopos.

  11. Na lista Permissões configuradas, selecione seu escopo e copie o nome completo do escopo.

    Captura de tela do painel de permissões configurado, mostrando que as permissões de acesso de leitura são concedidas.

Etapa 3: Obter o código de exemplo do SPA

Este exemplo demonstra como um aplicativo de página única pode usar o Azure AD B2C para inscrição e entrada de usuários. Em seguida, o aplicativo adquire um token de acesso e chama uma API da Web protegida.

Para obter o código de exemplo do SPA, siga um destes procedimentos:

  • Faça o download de um arquivo zip.

  • Clone o exemplo do GitHub executando o seguinte comando:

    git clone https://github.com/Azure-Samples/ms-identity-b2c-javascript-spa.git
    

Etapa 3.1: Atualizar o exemplo de SPA

Agora que você obteve o exemplo de SPA, atualize o código com seus valores de API Web e B2C do Azure AD. Na pasta de exemplo, na App pasta, abra os arquivos JavaScript listados na tabela a seguir e atualize-os com seus valores correspondentes.

Ficheiro Key valor
authConfig.js clientId O ID DO SPA da etapa 2.3.
policies.js Nomes Os fluxos de usuário ou a política personalizada que você criou na etapa 1.
policies.js autoridades Seus fluxos de usuário do Azure AD B2C ou autoridades de políticas personalizadas, como https://<your-tenant-name>.b2clogin.com/<your-tenant-name>.onmicrosoft.com/<your-sign-in-sign-up-policy>. Substitua your-sign-in-sign-up-policy pelo fluxo de usuário ou pela política personalizada criada na etapa 1
policies.js authorityDomínio Seu domínio de autoridade do Azure AD B2C, como <your-tenant-name>.b2clogin.com.
apiConfig.js b2cÂmbitos Os escopos da API da Web criados na etapa 2.2 (por exemplo, b2cScopes: ["https://<your-tenant-name>.onmicrosoft.com/tasks-api/tasks.read"]).
apiConfig.js Api web A URL da API da Web, http://localhost:5000/hello.

O código resultante deve ser semelhante ao exemplo a seguir:

authConfig.js:

const msalConfig = {
    auth: {
      clientId: "<your-MyApp-application-ID>", // This is the ONLY mandatory field; everything else is optional.
      authority: b2cPolicies.authorities.signUpSignIn.authority, // Choose sign-up/sign-in user-flow as your default.
      knownAuthorities: [b2cPolicies.authorityDomain], // You must identify your tenant's domain as a known authority.
      redirectUri: "http://localhost:6420", // You must register this URI on Azure Portal/App Registration. Defaults to "window.location.href".
    },
    cache: {
      cacheLocation: "sessionStorage",  
      storeAuthStateInCookie: false, 
    },
    system: {
      loggerOptions: {
        loggerCallback: (level, message, containsPii) => {
          if (containsPii) {
            return;
          }
          switch (level) {
            case msal.LogLevel.Error:
              console.error(message);
              return;
            case msal.LogLevel.Info:
              console.info(message);
              return;
            case msal.LogLevel.Verbose:
              console.debug(message);
              return;
            case msal.LogLevel.Warning:
              console.warn(message);
              return;
          }
        }
      }
    }
  };
};

const loginRequest = {
  scopes: ["openid", ...apiConfig.b2cScopes],
};

const tokenRequest = {
  scopes: [...apiConfig.b2cScopes],  // e.g. ["https://fabrikamb2c.onmicrosoft.com/helloapi/demo.read"]
  forceRefresh: false // Set this to "true" to skip a cached token and go to the server to get a new token
};

policies.js:

const b2cPolicies = {
    names: {
        signUpSignIn: "b2c_1_susi",
        forgotPassword: "b2c_1_reset",
        editProfile: "b2c_1_edit_profile"
    },
    authorities: {
        signUpSignIn: {
            authority: "https://your-tenant-name.b2clogin.com/your-tenant-name.onmicrosoft.com/b2c_1_susi",
        },
        forgotPassword: {
            authority: "https://your-tenant-name.b2clogin.com/your-tenant-name.onmicrosoft.com/b2c_1_reset",
        },
        editProfile: {
            authority: "https://your-tenant-name.b2clogin.com/your-tenant-name.onmicrosoft.com/b2c_1_edit_profile"
        }
    },
    authorityDomain: "your-tenant-name.b2clogin.com"
}

apiConfig.js:

const apiConfig = {
  b2cScopes: ["https://your-tenant-name.onmicrosoft.com/tasks-api/tasks.read"],
  webApi: "http://localhost:5000/hello"
};

Etapa 4: Obter o código de exemplo da API da Web

Agora que a API Web está registrada e você definiu seus escopos, configure o código da API Web para trabalhar com seu locatário do Azure AD B2C.

Para obter o código de exemplo da API Web, siga um destes procedimentos:

Etapa 4.1: Atualizar a API da Web

  1. Abra o arquivo config.json no editor de códigos.

  2. Modifique os valores das variáveis com o registro do aplicativo criado anteriormente. E atualize o policyName com o fluxo de usuário que você criou como parte dos pré-requisitos (por exemplo, b2c_1_susi).

    "credentials": {
        "tenantName": "<your-tenant-name>",
        "clientID": "<your-webapi-application-ID>"
    },
    "policies": {
        "policyName": "b2c_1_susi"
    },
    "resource": {
        "scope": ["tasks.read"] 
    },
    

Etapa 4.2: Ativar o CORS

Para permitir que seu aplicativo de página única chame a API da Web Node.js, você precisa habilitar o compartilhamento de recursos entre origens (CORS) na API da Web. Em um aplicativo de produção, tenha cuidado com qual domínio está fazendo a solicitação. Neste exemplo, permita solicitações de qualquer domínio.

Para habilitar o CORS, use o seguinte middleware. No exemplo de código de API da Web Node.js que você baixou, ele já foi adicionado ao arquivo index.js .

app.use((req, res, next) => {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Authorization, Origin, X-Requested-With, Content-Type, Accept");
    next();
});

Etapa 5: Executar o SPA e a API da Web

Agora você está pronto para testar o acesso com escopo do aplicativo de página única à API. Execute a API Web Node.js e o aplicativo JavaScript de página única de exemplo em sua máquina local. Em seguida, entre no aplicativo de página única e selecione o botão Chamar API para iniciar uma solicitação para a API protegida.

Executar a API Web Node.js

  1. Abra uma janela do console e mude para o diretório que contém o exemplo de API da Web Node.js. Por exemplo:

    cd active-directory-b2c-javascript-nodejs-webapi
    
  2. Execute os seguintes comandos:

    npm install && npm update
    node index.js
    

    A janela do console exibe o número da porta onde o aplicativo está hospedado.

    Listening on port 5000...
    

Executar o aplicativo de página única

  1. Abra outra janela do console e mude para o diretório que contém o exemplo de SPA JavaScript. Por exemplo:

    cd ms-identity-b2c-javascript-spa
    
  2. Execute os seguintes comandos:

    npm install && npm update
    npm start
    

    A janela do console exibe o número da porta de onde o aplicativo está hospedado.

    Listening on port 6420...
    
  3. Para visualizar o aplicativo, vá para http://localhost:6420 em seu navegador.

    Captura de tela do aplicativo de exemplo SPA exibido na janela do navegador.

  4. Conclua o processo de inscrição ou login. Depois de iniciar sessão com sucesso, deverá ver a mensagem "Utilizador <com o seu nome> de utilizador com sessão iniciada".

  5. Selecione o botão Chamar API . O SPA envia o token de acesso em uma solicitação para a API da Web protegida, que retorna o nome para exibição do usuário conectado:

    Captura de tela do SPA em uma janela do navegador, mostrando o resultado JSON do nome de usuário retornado pela API.

Implementar a sua aplicação

Em um aplicativo de produção, o URI de redirecionamento de registro do aplicativo é normalmente um ponto de extremidade acessível publicamente onde seu aplicativo está sendo executado, como https://contoso.com/signin-oidc.

Você pode adicionar e modificar URIs de redirecionamento em seus aplicativos registrados a qualquer momento. As seguintes restrições se aplicam aos URIs de redirecionamento:

  • O URL de resposta deve começar com o esquema https.
  • O URL de resposta diferencia maiúsculas de minúsculas. Seu caso deve corresponder ao caso do caminho da URL do seu aplicativo em execução.

Próximos passos

Para obter mais informações sobre os conceitos discutidos neste artigo: