2016-06-07 1 views
1

A l'aide de l'API Graph et des flux d'authentification/autorisation associés, comment puis-je accéder aux données de tous les utilisateurs d'une organisation? En outre, plusieurs organisations/locataires doivent être en mesure d'utiliser l'application.Comment accéder aux données d'un autre utilisateur via l'API graphique?

À titre d'exemple: j'ai une application qui doit lire les événements de tous les calendriers de tous les utilisateurs sous contoso.onmicrosoft.com. Je voudrais que [email protected], l'administrateur, autorise l'application qui pourra alors lire les données mentionnées. L'utilisation de l'API gérée peut être facilement effectuée via l'emprunt d'identité.

Cependant, je suis en train de faire la même chose avec l'API graphique et OAuth, mais je ne peux pas trouver une solution avant droit, ou je dois manquer quelque chose de très évident. J'ai créé une application via manage.windowsazure.com (multi-locataire) et l'ai configurée pour qu'elle nécessite l'API Microsoft Graph (toutes les autorisations d'application et déléguées).

j'ai fait ce qui suit:

1) Point [email protected] vers https://login.microsoftonline.com/common/oauth2/authorize?response_type=code&redirect_uri=<my redirect url>&client_id=<my client id>

2) Jack autorise l'application

3) Je reviens: <my redirect url>/?code=<my authorization code>&session_state=<blah>

4) J'envoie une demande POST comme ci-dessous:

POST https://login.microsoftonline.com/common/oauth2/token 
Headers: content-type: application/x-www-form-urlencoded 

Body: 
grant_type=authorization_code&code=<my auth code from step above> 
&redirect_uri=<my redirect url> 
&client_id=<my client id> 
&client_secret=<my client secret> 
&resource=https%3A%2F%2Fgraph.microsoft.com%2F 

5) Quand je fais ce qui suit:

GET https://graph.microsoft.com/v1.0/users/[email protected]/messages 
Headers: Authorization: Bearer <auth token from step #4> 

je reçois une réponse 200 OK avec les messages.

Quand je fais ce qui suit:

GET https://graph.microsoft.com/v1.0/users/[email protected]/messages 
Headers: Authorization: Bearer <auth token from step #4> 

Je reçois 403 réponse interdite avec:

{ 
    "error": { 
     "code": "ErrorAccessDenied", 
     "innerError": { 
      "date": "2016-06-07T08:47:27", 
      "request-id": "5b629e30-e6bd-474d-b3dd-8ce25c5ad1c4" 
     }, 
     "message": "Access is denied. Check credentials and try again." 
    } 
} 

Répondre

3

Les flux/URL que vous avez référencés concernent le flux de code d'autorisation qui exploite les étendues déléguées.

A) Si vous voulez que l'application pour que le travail (à savoir accéder à tous les calendriers) pour les admins vous utilisez le bon débit.

B) Si vous voulez que l'application fonctionne pour tous les utilisateurs après le consentement admin à, vous aurez besoin d'utiliser l'application (informations d'identification du client) et utiliser les étendues de flux d'application. Cela signifie que vous devrez séparer le consentement du flux d'authentification normal.

Pour consentement, vous devrez pour pointer l'administrateur à l'adresse suivante:

GET https://login.microsoftonline.com/common/oauth2/authorize?resource=https://graph.microsoft.com/&client_id=<YourClientId>&client_secret=<YourClientSecret>&response_type=code&redirectUri=<YourRedirectUri>&prompt=admin_consent 

Pour flux auth vous aurez besoin d'un seul appel de votre serveur web:

POST https://login.microsoftonline.com/common/oauth2/token 
body resource=https://graph.microsoft.com/&client_id=<YourClientId>&client_secret=<YourClientSecret>&response_type=code 

Ou mieux encore, il suffit d'utiliser la surcharge AquireToken d'ADAL (resource, clientCredentials).

Une fois cela fait, votre application devrait être bon pour aller faire des demandes à Graph.

Peu importe si vous voulez coller à A) ou passer à B), vérifier que les choses sont mis en place correctement, vous pouvez:

  1. Vérifiez le jeton que vous revenez de graphique (celui vous joindre à la demande ainsi au porteur) et confirmer qu'il a une entrée de rôles avec les rôles dont vous avez besoin à savoir Calendars.Read

NOTE: les étapes suivantes 2.a 2.b & vous demandent d'avoir admin à un locataire test où vous consentez à l'application.

2.a Utilisez GraphExplorer (https://graphexplorer2.azurewebsites.net/) et confirmer que le consentement a été correctement mis en place par l'interrogation

beta/servicePrincipals?$filter=displayName eq '[YourApplicationName]' 

Si rien ne se présente, le personne n'a consenti à la demande.

2.b (uniquement pour les flux de code auth avec champs délégués) Utilisez GraphExplorer et confirmez que soit la délégation a été correctement autorisé en questionnant

beta/oauth2permissiongrants?$filter=clientId eq '[IdFrom ServicePrincipal in 2.a]' 

Et vous assurant soit un résultat pour l'utilisateur spécifique question ou pour "AllPrincipals".


Plus d'informations sur l'application vs portées ici délégués: http://graph.microsoft.io/en-us/docs/authorization/permission_scopes

Plus d'informations sur l'application de flux ici: https://graph.microsoft.io/en-us/docs/authorization/app_only

+0

Cela a aidé! Je suis passé à la version App Only (j'ai eu quelques problèmes avec les certificats, mais à la fin ça a fonctionné, sans eux). La clé, ressemble, ajoutait 'prompt = admin_consent', puisque j'ai essayé le flux avant, mais n'a pas fonctionné. J'ai quelques problèmes avec certains appels d'API, mais il y a beaucoup de place pour ça. :) Merci encore! –

2

S'il vous plaît utiliser l'application seule auth flux (voir https://graph.microsoft.io/en-us/docs/authorization/app_only) à utiliser les autorisations d'application - Pour la demande de jetons (étape 4), vous devez passer grant_type = client_credentials au lieu de grant_type = code_autorisation.