Autenticar un usuario en un bot de Microsoft Teams de autenticación

Importante

Este artículo se basa en el SDK de Bot Framework de v3. Si está buscando la documentación actual versión 4.6 o posterior del SDK, consulte la sección bots de conversación.

Es posible que quieras usar muchos servicios dentro de la aplicación Teams y la mayoría de esos servicios requieren autenticación y autorización para obtener el acceso. Los Servicios incluyen Facebook, Twitter y Teams. Los usuarios de Teams tienen información de perfil de usuario almacenada en Azure Active Directory (Azure AD) mediante Microsoft Graph. Este tema se centra en la autenticación mediante Azure AD para obtener acceso. OAuth 2.0 es un estándar abierto para la autenticación que usan Azure AD y muchos otros proveedores de servicios. Comprender OAuth 2.0 es un requisito previo para trabajar con la autenticación en Teams y Azure AD. En los ejemplos siguientes se usa el flujo de concesión implícita de OAuth 2.0 para leer finalmente la información de perfil del usuario de Azure AD y Microsoft Graph.

El flujo de autenticación descrito en este tema es similar a las pestañas, excepto que las pestañas pueden usar el flujo de autenticación basado en web y los bots requieren que la autenticación se controle desde el código. Los conceptos de este tema también serán útiles al implementar la autenticación desde la plataforma móvil.

Para obtener una introducción general al flujo de autenticación para bots, vea el tema Flujo de autenticación en bots.

Configuración de proveedores de identidades

Consulte el tema Configurar proveedores de identidades para obtener pasos detallados sobre cómo configurar las direcciones URL de redireccionamiento de devolución de llamada de OAuth 2.0 al usar Azure Active Directory como proveedor de identidades.

Iniciar flujo de autenticación

El flujo de autenticación debe desencadenarse mediante una acción del usuario. No abra la ventana emergente de autenticación automáticamente, ya que podría desencadenar el bloqueador de elementos emergentes del explorador y confundir al usuario.

Agregar interfaz de usuario para iniciar la autenticación

Agrega la interfaz de usuario al bot para permitir que el usuario inicie sesión cuando sea necesario. Aquí se hace desde una tarjeta miniatura, en 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);
}

Se han agregado tres botones a la tarjeta de héroe: Iniciar sesión, Mostrar perfil y Cerrar sesión.

Iniciar sesión en el usuario

Debido a la validación que debe realizarse por motivos de seguridad y la compatibilidad con las versiones móviles de Teams, el código no se muestra aquí, pero este es un ejemplo del código que inicia el proceso cuando el usuario presiona el botón Iniciar sesión..

La validación y la compatibilidad móvil se explican en el tema Flujo de autenticación en bots.

Asegúrese de agregar el dominio de la dirección URL de redireccionamiento de autenticación a la validDomains sección del manifiesto. Si no inicias sesión, no aparecerá el elemento emergente.

Mostrar información de perfil de usuario

Aunque obtener un token de acceso es difícil debido a todas las transiciones de ida y vuelta en diferentes sitios web y a los problemas de seguridad que deben solucionarse, una vez que tenga un token, obtener información de Azure Active Directory es sencillo. El bot realiza una llamada al punto Graph me con el token de acceso. Graph responde con la información del usuario de la persona que inició sesión. La información de la respuesta se usa para construir una tarjeta bot y se envía.

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

Si el usuario no ha iniciado sesión, se le pedirá que lo haga.

Cerrar la sesión del usuario

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

Otras muestras

Para ver el código de ejemplo que muestra el proceso de autenticación del bot, vea: