Autenticar um usuário em um bot do Microsoft TeamsAuthenticate a user in a Microsoft Teams bot

Importante

Os artigos desta seção são baseados no SDK do v3 bot Framework.The articles in this section are based on the v3 Bot Framework SDK. Se você estiver procurando a documentação atual (versão 4,6 ou posterior do SDK), consulte a seção bots de conversa .If you're looking for current documentation (version 4.6 or later of the SDK) see the Conversational Bots section.

Há muitos serviços que você pode desejar usar dentro do seu aplicativo do Microsoft Teams e a maioria desses serviços requer autenticação e autorização para obter acesso ao serviço.There are many services that you may wish to consume inside your Teams app, and most of those services require authentication and authorization to get access to the service. Os serviços incluem o Facebook, o Twitter e o Microsoft Teams.Services include Facebook, Twitter, and of course Teams. Os usuários de Teams têm informações de perfil de usuário armazenadas no Azure Active Directory (Azure AD) usando o Microsoft Graph.Users of Teams have user profile information stored in Azure Active Directory (Azure AD) using Microsoft Graph. Este artigo se concentrará na autenticação usando o Azure AD para obter acesso a essas informações.This article will focus on authentication using Azure AD to get access to this information.

O OAuth 2,0 é um padrão aberto para autenticação usada pelo Azure AD e muitos outros provedores de serviços.OAuth 2.0 is an open standard for authentication used by Azure AD and many other service providers. A compreensão do OAuth 2,0 é um pré-requisito para trabalhar com autenticação no Teams e no Azure AD.Understanding OAuth 2.0 is a prerequisite for working with authentication in Teams and Azure AD. Os exemplos abaixo usam o fluxo de concessão implícita do OAuth 2,0 com o objetivo de eventualmente ler as informações de perfil do usuário do Azure AD e do Microsoft Graph.The examples below use the OAuth 2.0 Implicit Grant flow with the goal of eventually reading the user's profile information from Azure AD and Microsoft Graph.

O fluxo de autenticação descrito neste artigo é muito semelhante ao das guias, exceto pelo fato de que as guias podem usar o fluxo de autenticação baseado na Web, e os bots exigem que a autenticação seja conduzida a partir do código.The authentication flow described in this article is very similar to that of tabs except that tabs can use web based authentication flow, and bots require authentication to be driven from code. Os conceitos neste artigo também serão úteis na implementação da autenticação da plataforma móvel.The concepts in this article will also be useful when implementing authentication from the mobile platform.

Para obter uma visão geral do fluxo de autenticação para bots, consulte o tópico fluxo de autenticação em bots.For a general overview of authentication flow for bots see the topic Authentication flow in bots.

Configurando provedores de identidadeConfiguring identity providers

Consulte o tópico Configure Identity Providers para obter etapas detalhadas sobre como configurar URLs de redirecionamento de retorno de chamada OAuth 2,0 ao usar o Azure Active Directory como um provedor de identidade.See the topic Configure identity providers for detailed steps on configuring OAuth 2.0 callback redirect URL(s) when using Azure Active Directory as an identity provider.

Iniciar o fluxo de autenticaçãoInitiate authentication flow

O fluxo de autenticação deve ser acionado por uma ação do usuário.Authentication flow should be triggered by a user action. Você não deve abrir o pop-up de autenticação automaticamente porque isso provavelmente disparará o bloqueador de pop-ups do navegador, além de confundir o usuário.You should not open the authentication pop-up automatically because this is likely to trigger the browser's pop-up blocker as well as confuse the user.

Adicionar interface do usuário para iniciar a autenticaçãoAdd UI to start authentication

Adicione interface do usuário ao bot para permitir que o usuário entre quando necessário.Add UI to the bot to enable the user to sign in when needed. Isso é feito a partir de um cartão de miniatura, no TypeScript:Here it is done from a Thumbnail card, in TypeScript:

// Show prompt of options
protected async promptForAction(session: builder.Session): Promise<void> {
    let msg = new builder.Message(session)
        .addAttachment(new builder.ThumbnailCard(session)
            .title(this.providerDisplayName)
            .buttons([
                 builder.CardAction.messageBack(session, "{}", "Sign in")
                     .text("SignIn")
                     .displayText("Sign in"),
                  builder.CardAction.messageBack(session, "{}", "Show profile")
                     .text("ShowProfile")
                     .displayText("Show profile"),
                  builder.CardAction.messageBack(session, "{}", "Sign out")
                     .text("SignOut")
                     .displayText("Sign out"),
            ]));
    session.send(msg);
}

Três botões foram adicionados ao cartão herói: entrar, mostrar perfil e sair.Three buttons have been added to the Hero Card: Sign in, Show Profile, and Sign out.

Inscrever o usuário emSign the user in

Por causa da validação que deve ser executada por motivos de segurança e o suporte para as versões móveis do Teams, o código não é mostrado aqui, mas aqui está um exemplo de código que inicia o processo quando o usuário pressiona o botão entrar...Because of the validation that must be performed for security reasons and the support for the mobile versions of Teams, the code isn't shown here, but here's an example of the code that kicks off the process when the user presses the Sign in button..

A validação e o suporte móvel são explicados no fluxo de autenticação do tópico em bots.The validation and mobile support are explained in the topic Authentication flow in bots.

Certifique-se de adicionar o domínio de sua URL de redirecionamento de autenticação à validDomains seção do manifesto.Be sure to add the domain of your authentication redirect URL to the validDomains section of the manifest. Caso contrário, o pop-up de logon não será exibido.If you don't, the login popup will not appear.

Mostrando informações de perfil de usuárioShowing user profile information

Embora obter um token de acesso seja difícil devido a todas as transições de frente e para trás em diferentes sites e os problemas de segurança que devem ser resolvidos, quando você tiver um token, obter informações do Azure Active Directory é simples.Although getting an access token is difficult because of all the transitions back and forth across different websites and the security issues that must be addressed, once you have a token, obtaining information from Azure Active Directory is straightforward. O bot faz uma chamada para o me ponto de extremidade do gráfico com o token de acesso.The bot makes a call to the me Graph endpoint with the access token. O Graph responde com as informações do usuário para a pessoa que fez logon.Graph responds with the user information for the person who logged in. As informações da resposta são usadas para criar um cartão de bot e enviados.Information from the response is used to construct a bot card and sent.

// Show user profile
protected async showUserProfile(session: builder.Session): Promise<void> {
    let azureADApi = this.authProvider as AzureADv1Provider;
    let userToken = this.getUserToken(session);

    if (userToken) {
        let profile = await azureADApi.getProfileAsync(userToken.accessToken);
        let profileCard = new builder.ThumbnailCard()
            .title(profile.displayName)
            .subtitle(profile.mail)
            .text(`${profile.jobTitle}<br/> ${profile.officeLocation}`);
        session.send(new builder.Message().addAttachment(profileCard));
    } else {
        session.send("Please sign in to AzureAD so I can access your profile.");
    }

    await this.promptForAction(session);
}

// Helper function to make the Graph API call
public async getProfileAsync(accessToken: string): Promise<any> {
    let options = {
        url: "https://graph.microsoft.com/v1.0/me",
        json: true,
        headers: {
            "Authorization": `Bearer ${accessToken}`,
        },
    };
    return await request.get(options);
}

Se o usuário não estiver conectado, ele será solicitado a fazê-lo.If the user is not signed in they are prompted to do so.

Cancelar a inscrição do usuárioSign the user out

// Handle user logout request
private async handleLogout(session: builder.Session): Promise<void> {
    if (!utils.getUserToken(session, this.providerName)) {
        session.send(`You're already signed out of ${this.providerDisplayName}.`);
    } else {
        utils.setUserToken(session, this.providerName, null);
        session.send(`You're now signed out of ${this.providerDisplayName}.`);
    }

    await this.promptForAction(session);
}

Outros exemplosOther samples

Para ver o código de exemplo que mostra o processo de autenticação do bot, confira:For sample code showing the bot authentication process see: