Habilitar logon único em um Suplemento do Office com autenticação de aplicativo aninhado

Use a biblioteca MSAL.js com autenticação de aplicativo aninhada (NAA) para habilitar o logon único (SSO) a partir do seu Suplemento do Office. Os procedimentos neste artigo orientam você na criação de um registro de aplicativo e na adição de código ao seu projeto para usar o NAA.

Hosts e contas com suporte da NAA

O NAA dá suporte a contas da Microsoft e identidades do Microsoft Entra ID (trabalho/escola). Ele não dá suporte ao Azure Active Directory B2C para cenários de gerenciamento de identidade business-to-consumer. Para obter mais informações sobre os requisitos do NAA, consulte Conjunto de requisitos de autenticação de aplicativo aninhado.

Registrar seu aplicativo de página única

Você precisará criar um registro do Microsoft Azure Azure App para seu suplemento no portal do Azure. O registro do aplicativo deve ter no mínimo:

  • Um nome
  • Um tipo de conta com suporte
  • Um redirecionamento de SPA para NAA

Se o suplemento exigir registro de aplicativo adicional além do NAA e do SSO, consulte Aplicativo de página única: registro de aplicativo.

Adicionar um agente confiável por meio do redirecionamento de SPA

Para habilitar o NAA, o registro do aplicativo deve incluir um URI de redirecionamento específico para indicar à plataforma de identidade da Microsoft que seu suplemento permite ser intermediado por hosts com suporte. O URI de redirecionamento do aplicativo deve ser do tipo Aplicativo de Página Única e estar em conformidade com o esquema a seguir.

brk-multihub://your-add-in-domain

Seu domínio deve incluir apenas a origem e não seus subcaminhos. Por exemplo:

✔️ brk-multihub://localhost:3000
✔️ brk-multihub://www.contoso.com
❌ brk-multihub://www.contoso.com/go

Os grupos de agentes confiáveis são dinâmicos por design e podem ser atualizados no futuro para incluir hosts adicionais nos quais o suplemento possa usar fluxos NAA. Atualmente, o grupo brk-multihub inclui Word, Excel, PowerPoint, Outlook e Teams (para quando o Office for ativado internamente).

Importante

Para o Word, Excel e PowerPoint na Web, você também precisa de um redirecionamento adicional, já que o navegador usa um fluxo de autenticação padrão. O URI de redirecionamento do SPA deve fazer referência à página HTML na qual você usará a biblioteca MSAL.js para solicitar tokens por meio do NAA.

Use as etapas a seguir para configurar um registro de aplicativo para seu suplemento do Office.

  1. Entre no portal do Azure com as credenciais de administrador para sua locação do Microsoft 365. Por exemplo, MyName@contoso.onmicrosoft.com.

  2. Selecione Registros de aplicativos. Se você não vir o ícone, procure por "registro do aplicativo" na barra de pesquisa.

    A home page do portal do Azure.

    A página Registros de aplicativo é exibida.

  3. Selecione Novo registro.

    Novo registro no painel Registros de aplicativo.

    A página Registrar um aplicativo é exibida.

  4. Na página Registrar um aplicativo, defina os valores da seguinte forma.

    • Defina Nome para contoso-office-add-in-sso.
    • Defina tipos de conta com suporte para Contas em qualquer diretório organizacional (qualquer diretório do Azure AD – multilocatário) e contas pessoais da Microsoft (por exemplo, Skype, Xbox).
    • Defina o URI de redirecionamento para usar o aplicativo de página única (SPA) da plataforma e o URI como brk-multihub://localhost:3000. Esse redirecionamento pressupõe que você esteja testando seu suplemento a partir de um servidor localhost.

    Registrar um painel de aplicativos com o nome e a conta com suporte concluídos.

  5. Selecione Registrar. É exibida uma mensagem informando que o registro do aplicativo foi criado.

    Mensagem informando que o registro do aplicativo foi criado.

  6. Copie e salve o valor para a ID do aplicativo (cliente). Você a usará em um procedimento posterior.

    Painel de registro do aplicativo para Contoso exibindo a ID do cliente e a ID do diretório.

Se o suplemento der suporte ao Word, Excel ou PowerPoint na Web, você deverá adicionar um URI de redirecionamento de SPA para a página do painel de tarefas. Use as etapas a seguir para adicionar um URI de redirecionamento de SPA para sua página do painel de tarefas.

  1. No painel esquerdo, selecione Gerenciar > Autenticação. A página de autenticação no registro de aplicativo do Azure.
  2. Na seção Configurações da plataforma , há uma lista de URIs de redirecionamento de aplicativo de página única.
  3. Selecione Adicionar URI. Selecionando a opção adicionar URI na página de registro do aplicativo do Azure.
  4. Insira https://localhost:3000/taskpane.html e selecione Salvar. Esse URI de redirecionamento pressupõe que você esteja usando o NAA do taskpane.html arquivo. Adicionando o URI de redirecionamento do painel de tarefas na página de registro de aplicativo do Azure.

Configurar MSAL para usar NAA

Configure seu suplemento para usar o NAA chamando a createNestablePublicClientApplication função no MSAL. A MSAL retorna um aplicativo cliente público que pode ser aninhado em um host de aplicativo nativo (por exemplo, Outlook) para adquirir tokens para seu aplicativo.

As etapas a seguir mostram como habilitar o taskpane.js NAA no arquivo ou taskpane.ts em um projeto criado com yo office (projeto do Painel de Tarefas do Suplemento do Office ).

  1. Adicione o @azure/msal-browser pacote à dependencies seção do package.json arquivo para seu projeto. Para obter mais informações sobre esse pacote, consulte Biblioteca de Autenticação da Microsoft para JavaScript (MSAL.js) para Aplicativos Browser-Based Single-Page. Para instalar a versão mais recente, execute o seguinte comando.

    npm install @azure/msal-browser
    
  2. Adicione o código a seguir à parte superior do taskpane.js arquivo ou taskpane.ts . Isso importará a biblioteca do navegador MSAL.

    import { createNestablePublicClientApplication, InteractionRequiredAuthError } from "@azure/msal-browser";
    

As etapas a seguir são diferentes para o Outlook e para o Word, Excel e PowerPoint. Selecione a guia que corresponde ao tipo de suplemento que você está criando.

Inicializar a biblioteca MSAL

Em seguida, você precisa inicializar a MSAL e obter uma instância do aplicativo cliente público.

Adicione o código a seguir ao taskpane.js arquivo ou taskpane.ts . Substitua o espaço reservado Enter_the_Application_Id_Here pela ID do aplicativo do Azure que você salvou anteriormente. Sobre a seguinte observação de código:

  • A initMsal função inicializa MSAL chamando createNestablePublicClientApplication. Isso cria um aplicativo cliente público aninhado que oferece suporte ao SSO com o Outlok.
  • A initMsal função define a autoridade como comum, que dá suporte a contas corporativas e de estudante ou contas pessoais da Microsoft. Se você quiser configurar um único locatário ou outros tipos de conta, consulte Opções de configuração do aplicativo para obter opções de autoridade adicionais.
let msalInstance = undefined;

/**
 * Initialize MSAL as a nestable public client application.
  */
async function initMsal() {
  if (!msalInstance) {
    const clientId = "Enter_the_Application_Id_Here";
    const msalConfig = {
      auth: {
        clientId: clientId,
        authority: "https://login.microsoftonline.com/common"
      },
      cache: {
        cacheLocation: "localStorage"
      }
    };
    msalInstance = await createNestablePublicClientApplication(msalConfig);
  }
}

Adquira seu primeiro token

Os tokens adquiridos pelo MSAL.js via NAA serão emitidos para sua ID de registro do aplicativo Azure. Nesta amostra de código, você adquire um token para a API do Graph. Se o usuário tiver uma sessão ativa com o Microsoft Entra ID, o token será adquirido silenciosamente. Caso contrário, a biblioteca solicitará que o usuário entre interativamente. O token é então usado para chamar a API do Graph.

As etapas a seguir mostram o padrão a ser usado para adquirir um token.

  1. Especifique seus escopos. O NAA dá suporte ao consentimento incremental e dinâmico, portanto, sempre solicite os escopos mínimos necessários para que seu código conclua sua tarefa.
  2. Chamar acquireTokenSilent. Isso obterá o token sem exigir interação do usuário.
  3. Se acquireTokenSilent falhar, chame acquireTokenPopup para exibir uma caixa de diálogo interativa para o usuário. acquireTokenSilent poderá falhar se o token tiver expirado ou se o usuário ainda não tiver consentido com todos os escopos solicitados.

O código a seguir mostra como implementar esse padrão de autenticação em seu próprio projeto.

  1. Substitua a run função no taskpane.js código a seguir ou taskpane.ts pelo seguinte. O código especifica os escopos mínimos necessários para ler os arquivos do usuário.

    export async function run() {
      await initMsal();
      // Specify minimum scopes needed for the access token.
      const tokenRequest = {
        scopes: ["Files.Read", "User.Read"],
      };
      let accessToken = null;
    
      // TODO 1: Use msalInstance to get an access token.
    
      // TODO 2: Call the Microsoft Graph API.
    }
    

    Importante

    A solicitação de token deve incluir escopos diferentes de apenas offline_access, openid, profile, ou email. Você pode usar qualquer combinação dos escopos anteriores, mas deve incluir pelo menos um escopo adicional. Caso contrário, a solicitação de token poderá falhar.

  2. Substitua TODO 1 pelo código a seguir. Esse código chama acquireTokenSilent para obter o token de acesso.

    try {
      const userAccount = await msalInstance.acquireTokenSilent(tokenRequest);
      console.log("Acquired token silently.");
      accessToken = userAccount.accessToken;
    } catch (silentError) {
      // TODO 1a: Handle acquireTokenSilent failure.
    
    }
    
  3. Substitua TODO 1a pelo código a seguir. Este código verifica se acquireTokenSilent foi lançado um InteractionRequiredAuthErrordomínio . Nesse caso, o código chama acquireTokenPopup para que a MSAL possa usar uma caixa de diálogo pop-up para interagir com o usuário. A interação pode ser necessária por vários motivos, como a conclusão da autorização multifator.

    if (silentError instanceof InteractionRequiredAuthError) {
      console.log(`Unable to acquire token silently: ${silentError}`);
      // Silent acquisition failed. Continue to interactive acquisition.
      try {
        const userAccount = await msalInstance.acquireTokenPopup(tokenRequest);
        console.log("Acquired token interactively.");
        accessToken = userAccount.accessToken;
      } catch (popupError) {
        // Acquire token interactive failure.
        console.error(`Unable to acquire token interactively: ${popupError}`);
        return;
      }
    } else {
      // Acquire token silent failure. Error can't be resolved through interaction.
      console.error(`Unable to acquire token silently: ${silentError}`);
      return;
    }
    

Chamar uma API

Depois de adquirir o token, use-o para chamar uma API. O exemplo a seguir mostra como chamar a API do Graph chamando fetch com o token anexado no cabeçalho Autorização.

  • Substitua TODO 2 pelo código a seguir.

    // Call the Microsoft Graph API with the access token.
    const response = await fetch(
      `https://graph.microsoft.com/v1.0/me/drive/root/children?$select=name&$top=10`,
      {
        headers: { Authorization: `Bearer ${accessToken}` },
      }
    );
    
    if (response.ok) {
      // Write file names to the console.
      const data = await response.json();
      const names = data.value.map((item) => item.name);
    
      // Be sure the taskpane.html has an element with Id = item-subject.
      const label = document.getElementById("item-subject");
    
      // Write file names to task pane and the console.
      const nameText = names.join(", ");
      if (label) label.textContent = nameText;
      console.log(nameText);
    } else {
      const errorText = await response.text();
      console.error("Microsoft Graph call failed - error text: " + errorText);
    }
    

Depois que todo o código anterior for adicionado à run função, verifique se um botão no painel de tarefas chama a run função. Em seguida, você pode fazer sideload do suplemento e experimentar o código.

O que é autenticação de aplicativo aninhado

A autenticação de aplicativo aninhado permite o SSO para aplicativos aninhados dentro de aplicativos da Microsoft com suporte. Por exemplo, o Excel no Windows executa seu suplemento dentro de um modo de exibição da Web. Nesse cenário, o suplemento é um aplicativo aninhado em execução no Excel, que é o host. A NAA também dá suporte a aplicativos aninhados no Teams. Por exemplo, se uma guia do Teams estiver hospedando o Excel e seu suplemento estiver carregado, ele estará aninhado no Excel, que também estará aninhado no Teams. Novamente, o NAA dá suporte a esse cenário aninhado e você pode acessar o SSO para obter a identidade do usuário e os tokens de acesso do usuário conectado.

Práticas recomendadas

Recomendamos as seguintes práticas recomendadas ao usar MSAL.js com NAA.

Use autenticação silenciosa sempre que possível

MSAL.js fornece o método que lida com a acquireTokenSilent renovação de token fazendo solicitações silenciosas de token sem perguntar ao usuário. Primeiro, o método procura um token válido em cache. Se não encontrar um, a biblioteca faz a solicitação silenciosa ao Microsoft Entra ID e, se houver uma sessão de usuário ativa, um novo token será retornado.

Em determinados casos, a acquireTokenSilent tentativa do método de obter o token falha. Alguns exemplos disso são quando há uma sessão de usuário expirada com o Microsoft Entra ID ou uma alteração de senha pelo usuário, o que requer interação do usuário. Quando o acquireTokenSilent falhar, você precisará chamar o método de token interativo acquireTokenPopup .

Ter um fallback quando o NAA não tiver suporte

Embora nos esforcemos para fornecer um alto grau de compatibilidade com esses fluxos no ecossistema da Microsoft, seu suplemento pode estar carregado em um host do Office mais antigo que não dá suporte a NAA. Nesses casos, seu suplemento não dará suporte ao SSO contínuo e talvez seja necessário recorrer a um método alternativo de autenticação do usuário. Consulte os exemplos de código neste artigo para obter exemplos que mostram como lidar com um cenário de fallback.

Use o código a seguir para marcar se há suporte para NAA quando o suplemento é carregado.

   Office.context.requirements.isSetSupported("NestedAppAuth", "1.1");

Para obter mais informações, consulte os seguintes recursos.

APIs MSAL.js suportadas pelo NAA

A tabela a seguir mostra quais APIs têm suporte quando o NAA está habilitado na configuração MSAL.

Método Suporte da NAA
acquireTokenByCode Não (gera exceção)
acquireTokenPopup Sim
acquireTokenRedirect Não (gera exceção)
acquireTokenSilent Sim
addEventCallback Sim
addPerformanceCallback Não (gera exceção)
disableAccountStorageEvents Não (gera exceção)
enableAccountStorageEvents Não (gera exceção)
getAccountByHomeId Sim
getAccountByLocalId Sim
getAccountByUsername Sim
getActiveAccount Sim
getAllAccounts Sim
getConfiguration Sim
getLogger Sim
getTokenCache Não (gera exceção)
handleRedirectPromise Não
initialize Sim
initializeWrapperLibrary Sim
loginPopup Sim
loginRedirect Não (gera exceção)
logout Não (gera exceção)
logoutPopup Não (gera exceção)
logoutRedirect Não (gera exceção)
removeEventCallback Sim
removePerformanceCallback Não (gera exceção)
setActiveAccount Não
setLogger Sim
ssoSilent Sim

Relatórios de segurança

Se você encontrar um problema de segurança com nossas bibliotecas ou serviços, relate o problema secure@microsoft.com com o máximo de detalhes que você puder oferecer. Seu envio pode se qualificar para uma recompensa por meio do programa Microsoft Bounty . Não poste problemas de segurança no GitHub ou em qualquer outro site público. Entraremos em contato com você logo após recebermos o relatório de problemas. Encorajamos você a receber novas notificações de incidentes de segurança visitando as notificações técnicas de segurança da Microsoft para assinar os Alertas de Comunicado de Segurança.

Exemplos de código

Nome do exemplo Descrição
Suplemento do Office com SSO usando autenticação de aplicativo aninhado Mostra como usar o NAA em um Suplemento do Office para acessar APIs do Microsoft Graph para o usuário conectado.
Suplemento do Outlook com SSO usando autenticação de aplicativo aninhado Mostra como usar o NAA em um Suplemento do Outlook para acessar APIs do Microsoft Graph para o usuário conectado.
Implementar o SSO em eventos em um suplemento do Outlook usando a autenticação de aplicativo aninhado Mostra como usar NAA e SSO em eventos de suplemento do Outlook.
Enviar declarações de identidade aos recursos usando a autenticação de aplicativo aninhado (NAA) e o SSO Mostra como enviar as declarações de identidade do usuário conectado (como nome, email ou uma ID exclusiva) para um recurso, como um banco de dados. Este exemplo substitui um padrão obsoleto por tokens herdados do Exchange Online.

Confira também