Проверка подлинности пользователя в роботе Microsoft TeamsAuthenticate a user in a Microsoft Teams bot

Важно!

Статьи, приведенные в этом разделе, основаны на пакете SDK "V3 Bot Framework".The articles in this section are based on the v3 Bot Framework SDK. Если вы ищете текущую документацию (версия 4,6 или более поздняя версия пакета SDK), ознакомьтесь с разделом " беседы Боты ".If you're looking for current documentation (version 4.6 or later of the SDK) see the Conversational Bots section.

Существует множество служб, которые вы можете использовать в приложении Teams, а большинство этих служб требуют проверки подлинности и авторизации для получения доступа к службе.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. Службы включают в себя Facebook, Twitter и учебные группы.Services include Facebook, Twitter, and of course Teams. Сведения о профилях пользователей в Teams хранятся в Azure Active Directory (Azure AD) с помощью Microsoft Graph.Users of Teams have user profile information stored in Azure Active Directory (Azure AD) using Microsoft Graph. Эта статья посвящена проверке подлинности с помощью Azure AD для получения доступа к этим сведениям.This article will focus on authentication using Azure AD to get access to this information.

OAuth 2,0 — это открытый стандарт проверки подлинности, используемый Azure AD, и многие другие поставщики услуг.OAuth 2.0 is an open standard for authentication used by Azure AD and many other service providers. Общие сведения о OAuth 2,0 является необходимым условием для работы с проверкой подлинности в Teams и Azure AD.Understanding OAuth 2.0 is a prerequisite for working with authentication in Teams and Azure AD. В приведенных ниже примерах используется неявный поток предоставления OAuth 2,0 с целью последующего считывания сведений профиля пользователя из Azure AD и 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.

Процесс проверки подлинности, описанный в этой статье, очень похож на тот, что используется для вкладок, за исключением того, что вкладки могут использовать веб-процесс проверки подлинности на основе веб-сервера, а Боты требует от кода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. Понятия, описанные в этой статье, также будут использоваться при реализации проверки подлинности на мобильной платформе.The concepts in this article will also be useful when implementing authentication from the mobile platform.

Общий обзор процесса проверки подлинности для Боты представлен в разделе Flow Authentication Flow in Боты.For a general overview of authentication flow for bots see the topic Authentication flow in bots.

Настройка поставщиков удостоверенийConfiguring identity providers

В разделе Настройка поставщиков удостоверений подробные указания по настройке URL-адресов перенаправления для обратного вызова OAuth 2,0 при использовании Azure Active Directory в качестве поставщика удостоверений.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.

Запуск процесса проверки подлинностиInitiate authentication flow

Процесс проверки подлинности должен инициироваться действием пользователя.Authentication flow should be triggered by a user action. Не следует открывать всплывающую подсказку проверки подлинности автоматически, так как это может вызвать блокирование всплывающих окон в браузере, а также запутать пользователя.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.

Добавление пользовательского интерфейса для запуска проверки подлинностиAdd UI to start authentication

Добавление пользовательского интерфейса к элементу ленты, чтобы разрешить пользователю выполнять вход при необходимости.Add UI to the bot to enable the user to sign in when needed. Здесь это делается с помощью карточки эскиза в 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);
}

В карточку главный Имиджевый баннер добавлены три кнопки: войти, Показать профиль и выйти.Three buttons have been added to the Hero Card: Sign in, Show Profile, and Sign out.

Подпишите пользователя вSign the user in

Из-за проверки, которая должна быть выполнена из соображений безопасности и поддержки версий Teams для мобильных устройств, код не показан здесь, но здесь приведен пример кода, который запускает процесс, когда пользователь нажимает кнопку входа...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..

Проверка и поддержка для мобильных устройств описаны в разделе Flow Authentication Flow in Боты.The validation and mobile support are explained in the topic Authentication flow in bots.

Не забудьте добавить домен URL-адреса перенаправления проверки подлинности в validDomains раздел манифеста.Be sure to add the domain of your authentication redirect URL to the validDomains section of the manifest. В противном случае всплывающее окно входа не появится.If you don't, the login popup will not appear.

Показ сведений о профилях пользователейShowing user profile information

Несмотря на то, что получение маркера доступа затрудняется, так как все переходы передаются по разным веб-сайтам и проблемы безопасности, которые необходимо устранить, при наличии маркера получение информации из Azure Active Directory является простым.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. Bot выполняет вызов конечной точки me Graph с помощью маркера доступа.The bot makes a call to the me Graph endpoint with the access token. Graph отвечает сведениям пользователя о пользователе, который вошел в систему.Graph responds with the user information for the person who logged in. Информация из отклика используется для создания и отправки почтовых карточек.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);
}

Если пользователь не вошел в систему, вам будет предложено сделать это.If the user is not signed in they are prompted to do so.

Выход пользователяSign 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);
}

Другие примерыOther samples

Пример кода, демонстрирующий процесс создания подлинности на Bot, см.For sample code showing the bot authentication process see: