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

Важно!

Эта статья основана на SDK bot Framework v3. Если вы ищете текущую версию документации 4.6 или более поздней версии SDK, см. раздел разговорных ботов.

Существует множество служб, которые можно использовать в приложении Teams, и большинство из них требуют проверки подлинности и авторизации для получения доступа. Службы включают Facebook, Twitter и Teams. Пользователи Teams имеют сведения о профиле пользователей, хранимые в Azure Active Directory (Azure AD) с помощью Microsoft Graph. В этом разделе основное внимание уделяется проверке подлинности с помощью Azure AD для получения доступа. OAuth 2.0 — это открытый стандарт проверки подлинности, используемый Azure AD и многими другими поставщиками услуг. Понимание OAuth 2.0 является обязательным условием для работы с проверкой подлинности в Teams Azure AD. В следующих примерах используется поток неявных грантов OAuth 2.0 для чтения сведений о профиле пользователя из Azure AD и Microsoft Graph.

Поток проверки подлинности, описанный в этой теме, похож на вкладки, за исключением того, что вкладки могут использовать поток проверки подлинности на основе веб-данных, а ботам требуется управлять проверкой подлинности из кода. Концепции в этом разделе также будут полезны при реализации проверки подлинности с мобильной платформы.

Общий обзор потока проверки подлинности для ботов см. в разделе Поток проверки подлинности в ботах.

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

См. в разделе Настройка поставщиков удостоверений для подробных действий по настройке URL-адреса перенаправления вызовов OAuth 2.0 при использовании Azure Active Directory в качестве поставщика удостоверений.

Начало потока проверки подлинности

Поток проверки подлинности должен быть вызван действием пользователя. Не открывайте всплывающее всплывающее окна проверки подлинности автоматически, так как это может вызвать блокатор всплывающее окна браузера и запутать пользователя.

Добавление пользовательского интерфейса для начала проверки подлинности

Добавьте пользовательский интерфейс в бот, чтобы пользователь при необходимости войду. Здесь это делается с карты Thumbnail в 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);
}

В карточку героя добавлены три кнопки: Вход, Показать профиль и выйти.

Впишите пользователя в

Из-за проверки, которая должна выполняться из соображений безопасности и поддержки мобильных версий Teams, код здесь не отображается, но вот пример кода, который запускает процесс, когда пользователь нажимает кнопку Вход.. .

Проверка и поддержка мобильных устройств объясняются в потоке проверки подлинности темы в ботах.

Обязательно добавьте url-адрес перенаправления домена проверки подлинности в validDomains раздел манифеста. Если вы не вопишитесь, всплывающее не появится.

Отображение сведений о профиле пользователя

Хотя получение маркера доступа затруднено из-за всех переходов взад и вперед на разных веб-сайтах и проблем безопасности, которые необходимо устранить, когда у вас есть маркер, получение информации из Azure Active Directory просто. Бот звонит в конечную точку me Graph с маркером доступа. Graph отвечает сведениями пользователя для пользователя, во входившего в систему. Сведения из ответа используются для создания бот-карты и отправлены.

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

Если пользователь не вошел, он должен сделать это.

Выход пользователя

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

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

Пример кода, показывающий процесс проверки подлинности ботов, см. в примере: