web-dev-qa-db-fra.com

Accès à l'API Microsoft Graph sans utiliser la page de connexion

Je souhaite accéder au seul lecteur d'un utilisateur pour télécharger un document ou récupérer un document à l'aide de l'API Graph. J'ai vu plusieurs exemples sur le net qui nécessitent l'utilisation de la page de connexion standard pour que l'utilisateur puisse se connecter. Vous devez obtenir le code d'autorisation sur la page de connexion, puis l'utiliser pour obtenir un jeton, qui peut enfin être utilisé pour accéder à une ressource comme le lecteur.

Je cherche un moyen de le faire sans passer par la page de connexion. Je peux avoir ma propre page de connexion où je peux demander à l'utilisateur de se connecter.

En bref, je veux accéder à la ressource de lecteur de l'API Graph en utilisant un client REST comme Postman (dès l'autorisation pour accéder à la ressource). Est-ce possible?

Bien que cela soit possible, il est fortement recommandé de ne pas le faire pour l'accès utilisateur individuel. Microsoft Graph ne prend en charge que OAUTH 2.0 comme protocole authZ, et nous vous recommandons d'utiliser les flux dans OAUTH où l'autorité de confiance est celle qui gère directement) Autoriser le code d'application à fournir l'interface utilisateur des formulaires pour les identifiants de connexion ouvrirait le vecteur d'attaque où votre application aurait un accès direct au mot de passe O365 de l'utilisateur, ce qui n'est pas une approche sécurisée.

2
GarethJ

Oui, c'est possible si vous avez les bonnes informations - tout ce que vous devez faire est d'obtenir un jeton d'accès délégué .

Explication:

Lorsqu'il s'agit de l'accès aux ressources, Microsoft Graph a deux niveaux d'exigences de jeton d'accès:

  • La plupart des méthodes ne prennent en charge que les jetons Application , ce qui signifie qu'une fois qu'une application OAuth a le consentement, elle peut accéder à la ressource quand elle le souhaite.
  • Mais pour certaines méthodes, cela ne suffit pas (elles sont trop sensibles pour un processus automatisé) et nécessitent un jeton délégué , c'est-à-dire un jeton qui contient à la fois un client et un utilisateur valides . Vous pouvez voir dans chaque documentation de méthode quel jeton elle requiert.

Les jetons d'accès normalement délégués sont le résultat des deux principaux flux OAuth qui nécessitent une interaction de l'utilisateur ( Octroi du code d'autorisation et Grant implicite ) mais vous pouvez également les obtenir à partir de deux autres flux: Grant Owner Credentials Grant et Subvention au nom de , tous deux pris en charge par Microsoft.

Pour un guide complet sur la façon de configurer tout ce dont vous avez besoin pour utiliser ces flux (y compris les exemples Postman), vous pouvez consulter mon article:

Obtention du jeton d'accès pour Microsoft Graph à l'aide de OAuth REST API

14
Eran Hertz

Oui c'est possible. Essentiellement, vous accordez l'accès à l'application API à Graph à la place d'un utilisateur.

La documentation pour un tel accès est ici:

https://developer.Microsoft.com/en-us/graph/docs/concepts/auth_v2_service

Vous devrez toujours demander un jeton porteur à envoyer avec toutes vos demandes REST, mais le jeton porteur sera pour l'application elle-même et non pour un utilisateur.

J'ai configuré cela pour l'une de mes applications à l'aide du SDK Graph pour .NET, donc si vous avez besoin d'exemples spécifiques pour SDK Graph pour .NET, faites-le moi savoir.

5
Brian Kraemer

J'ai trouvé que la documentation n'est pas utile, surtout en termes d'accès à l'API Graph dans le contexte de l'application. Mais, j'ai réussi à obtenir le jeton d'accès dans le contexte de l'application ici:

private static async Task<string> AcquireToken()
{
    var tenant = "yourtenant.onmicrosoft.com";
    var resource = "https://graph.Microsoft.com/";
    var instance = "https://login.microsoftonline.com/";
    var clientID = "YourappID";
    var secret = "YourAppSecret";
    var authority = $"{instance}{tenant}";
    var authContext = new AuthenticationContext(authority);
    var credentials = new ClientCredential(clientID, secret);
    var authResult = await authContext.AcquireTokenAsync(resource, credentials);
    return authResult.AccessToken;
}
1
Chris J