Acoplamiento de NodeJS con la API de Microsoft Graph para operar los eventos del calendario de Outlook del usuario (2)

Obtenga tokens de acceso a través de Microsoft Identity Platform, incluida la autenticación de usuario y sin autenticación de usuario.

Prefacio

Al principio, se le pidió al usuario que ingresara la contraseña de la cuenta de Microsoft para completar la autenticación de inicio de sesión llamando a https://login.microsoftonline.com de Microsoft. Después de la autenticación, el usuario fue redirigido a la página web para continuar con la operación. Más tarde, el cliente dijo que no todos recuerdan su cuenta de Microsoft. Se requiere que la contraseña se cambie a inicio de sesión automático y luego se cambie a autenticación completamente libre de usuarios. Se logra la adquisición de información de todos los miembros del grupo, pero el cliente considera que la autoridad es demasiado grande y hay demasiado acceso a la información, por lo que se cambia a Para pasar la autenticación de usuario, es solo que el usuario autenticado es un administrador de grupo, y luego manipula los eventos de Outlook de otros miembros en el grupo.

En resumen, esta vez se han implementado los siguientes tres métodos de autenticación:

  1. A través de la plataforma de identidad de Microsoft , después de que el usuario completa el inicio de sesión de la cuenta, obtiene un token de acceso y lo redirecciona.
  2. Utilice el valor de Client Secret para completar la autenticación de identidad sin usuarios.
  3. Utilice la cuenta de usuario representativa, sin el inicio de sesión manual del usuario, y complete automáticamente la autenticación de identidad.

1. A través de la plataforma de identidad de Microsoft , después de que el usuario completa el inicio de sesión de la cuenta, obtiene un token de acceso y lo redirecciona.

Aquí está el angularDemo oficial para presentar un ejemplo de una situación en la que el usuario necesita ingresar manualmente la contraseña de la cuenta para completar la autenticación. Descargue el código de github, y después de una configuración simple (npm install), el resultado de ejecución es el siguiente

 

 

La imagen de arriba es para lograr la autenticación de identidad ingresando manualmente la contraseña de la cuenta de Microsoft por parte del usuario. Una vez completada la autenticación, se muestra la siguiente imagen

La autenticación es exitosa como se muestra en la figura anterior.

El código de procesamiento de autenticación de clave aquí es el siguiente

Una es llamar al método loginPopup introduciendo import {MsalService} desde '@ azure / msal-angular' y pasar OAuthSettings para lograr la autenticación.

  async signIn(): Promise<void> {
    let result = await this.msalService.loginPopup(OAuthSettings)
      .catch((reason) => {
        this.alertsService.addError('Login failed', JSON.stringify(reason, null, 2));
      });

    if (result) {
      this.authenticated = true;
      this.user = await this.getUser();
    }
  }


  // access Token 获取 
  async getAccessToken(): Promise<string> {
    let result = await this.msalService.acquireTokenSilent(OAuthSettings)
      .catch((reason) => {
        this.alertsService.addError('Get token failed', JSON.stringify(reason, null, 2));
      });

    if (result) {
      return result.accessToken;
    }

    // Couldn't get a token
    this.authenticated = false;
    return null;
  }

 Aquí se obtiene la importación de registro de accessToken * como MicrosoftGraph desde el servicio '@ microsoft / microsoft-graph-types'; y luego se llama a la API de Microsoft Graph para obtener información.

    this.graphClient = Client.init({
      authProvider: async (done) => {
        // Get the token from the auth service
        let token = await this.authService.getAccessToken()
          .catch((reason) => {
            done(reason, null);
          });

        if (token)
        {
          done(null, token);
        } else {
          done("Could not get an access token", null);
        }
      }
    });

Antes de usar la demostración oficial de NodeJs, debe modificar la información de configuración de example.env y la instalación de npm. El código clave es el siguiente:

 

En segundo lugar, utilice el valor de Client Secret para completar la autenticación de identidad sin usuarios.

La clave para la no autenticación de usuarios es el uso de CLIENT_SECRET, que es el valor secreto mencionado en el artículo anterior .

Además, el permiso de API registrado por Microsoft Azure debe agregarse con los permisos relacionados con  los permisos de la aplicación .

El primer paso es obtener el accessToken, donde se usa el módulo axios para iniciar una solicitud http, el código clave de nodeJS

import axios from 'axios';
const querystring: any = require('querystring');

const TENANT_ID = 'xxxx'
const CLIENT_ID = 'xxxx';
const CLIENT_SECRET = 'xxxx';

(async () => {

    const qs = querystring.stringify({
        client_id: CLIENT_ID,
        client_secret: CLIENT_SECRET,
        scope: 'https://graph.microsoft.com/.default',
        grant_type: 'client_credentials'
    });

    const url = `https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/token`;

    const result = await axios.request({
        url,
        method: "POST",
        data: qs
    });

    const access_token = result.data.access_token;
    console.log(access_token);
})();

 Llame a la API de Microsoft Graph a través del token de acceso sin usar @ microsoft / microsoft-graph-client

import axios from 'axios';
const ACCESS_TOKEN = 'xxxx';

(async () => {
    const itemList = [];
    const url = 'https://graph.microsoft.com/v1.0/groups';
    let page = url;

    do {
        const result = await axios.request({
            headers: {
                'Authorization': `Bearer ${ACCESS_TOKEN}`
            },
            url: page,
            method: "GET"
        });

        itemList.push(...result.data.value);
        page = result.data["@odata.nextLink"];

    } while (page);

    console.log(itemList);

})();

En el caso de usar @ microsoft / microsoft-graph-client, llame a la API de Microsoft Graph a través del token de acceso

var graph = require('@microsoft/microsoft-graph-client');

// graph.Client注册
function getAuthenticatedClient(accessToken) {
  // Initialize Graph client
  const client = graph.Client.init({
    // Use the provided access token to authenticate
    // requests
    authProvider: (done) => {
      done(null, accessToken);
    }
  });

  return client;
}

module.exports = {
  getUserDetails: async function(accessToken,userPrincipalName) {
    const client = getAuthenticatedClient(accessToken);

    //const user = await client.api('/me')
    const user = await client.api(`/users/${userPrincipalName}`)
      .select('displayName,givenName,jobTitle,mail,mobilePhone,officeLocation,preferredLanguage,surname,userPrincipalName,id,mailboxSettings')
      .get();
    return user;
  },
};

3. Utilice la cuenta de usuario representante para completar automáticamente la autenticación de identidad.

En comparación con la anterior sin autenticación de usuario, siempre que el código modificado sea el siguiente

import axios from 'axios';
const querystring: any = require('querystring');

const TENANT_ID = 'xxxx'
const CLIENT_ID = 'xxxx';
//const CLIENT_SECRET = 'xxxx';
const USER_ID = 'xxxx';
const USER_PASSWORD = 'xxxx';

(async () => {

    const qs = querystring.stringify({
        client_id: CLIENT_ID,
        username:USER_ID ,
        password:USER_PASSWORD,
        grant_type: 'password'
    });

    const url = `https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/token`;

    const result = await axios.request({
        url,
        method: "POST",
        data: qs
    });

    const access_token = result.data.access_token;
    console.log(access_token);
})();

Los anteriores son tres métodos de autenticación. Puede ver la información devuelta a través del análisis JWT para el token de acceso obtenido. Por ejemplo, el token de acceso obtenido sin autenticación de usuario se analiza de la siguiente manera. El token de acceso obtenido por el usuario es ligeramente diferente, ya que que se muestra en la segunda figura a continuación.

Token de acceso sin autenticación de usuario

 Token de acceso con autenticación de usuario

 

Supongo que te gusta

Origin blog.csdn.net/bai_ye_/article/details/115027298
Recomendado
Clasificación