2016-06-17 6 views
4

Ich versuche, die Microsoft Graph API zu verwenden, um ein Outlook/O365-Postfach nach Nachrichten abzufragen. I registered my app im Azure-Portal und erhielt die erforderlichen Informationen zum Abfragen der API. Die App verfügt über die Berechtigung Mail.Read. (Ich habe keinen Zugriff auf das Azure-Portal. Mir wurde gesagt, dass es auf diese Weise eingerichtet wurde.) Wenn ich mein Token vom OAuth-Endpunkt abrufe, funktioniert es bei nachfolgenden Aufrufen jedoch nicht. Ich verwende Pythons Request-Modul zum Testen.MS Graph API: ungültiges Authentifizierungstoken

Warum schlägt dieser Anruf fehl? Es scheint, als würde ich alle korrekten Informationen weitergeben, aber mir fehlt eindeutig etwas.

Ich erhalte die Token durch eine POST auf Durchführung:

https://login.microsoftonline.com/my.domain/oauth2/token 

ich die notwendigen Parameter übergeben:

data = {'grant_type': 'client_credentials', 'client_id': CLIENTID, 'client_secret': SECRET, 'resource': APPURI} 

und ich bekomme eine Antwort wie folgt aus:

{ 
    'resource': 'APPURI', 
    'expires_in': '3599', 
    'ext_expires_in': '3600', 
    'access_token': 'TOKENHERE', 
    'expires_on': '1466179206', 
    'not_before': '1466175306', 
    'token_type': 'Bearer' 
} 

Ich versuche jedoch, dieses Token zu verwenden, und es funktioniert nicht für irgendetwas, das ich anrufe. Ich bin es als Header vorbei:

h = {'Authorization': 'Bearer ' + TOKEN} 

ich diese URL bin Aufruf:

url = 'https://graph.microsoft.com/v1.0/users/[email protected]/messages' 

Insbesondere verwende ich diese:

r = requests.get(url, headers=h) 

Die Antwort ist ein 401:

{ 
    'error': { 
     'innerError': { 
      'date': '2016-06-17T15:06:30', 
      'request-id': '[I assume this should be removed for privacy]' 
     }, 
     'code': 'InvalidAuthenticationToken', 
     'message': 'Access token validation failure.' 
    } 
} 

Antwort

1

Es sei denn, Sie verwenden Client Credentials können Sie nicht auf die Nachrichten eines anderen Kontos zugreifen. Stellen Sie sicher, dass [email protected] dasselbe Konto ist, mit dem Sie authentifiziert werden, und dass diese Adresse auch der userPrincipalName für das Konto ist.

Sie können auch einen vereinfachten URI verwenden, um Ihre Nachrichten anzufordern und die userPrincipalName des Kontos mithilfe von /me zu umgehen. In diesem Fall wäre die GET Anfrage https://graph.microsoft.com/v1.0/me/messages

+0

finde ich auf meiner Web-Anwendung, um eine Aufgabe zu gründen bin versucht, die eine bestimmte Mailbox für neue E-Mails in regelmäßigen Abständen überprüfen wird und verarbeiten Anhänge auf ihnen. Klingt so, als würde ich es falsch machen. – vaindil

+1

Dies funktioniert, aber Sie müssen entweder ein Token mit den Anmeldeinformationen dieses Postfachs abrufen oder ein Konto mit Administratorrechten verwenden. –

+0

Hoffe, es ist okay, huckepack davon. Wir können nicht herausfinden, wo die Anmeldeinformationen unter dem Konto generiert werden. Ich kann mich nicht im Portal anmelden, da es kein Administratorkonto ist. Wo würden wir das machen? – vaindil

0

Es lohnt sich sein Hinweis darauf, dass selbst wenn MS Azure Dokumentation für die Auflistung, die Ressource nicht die Notwendigkeit geben, ich konnte nie ohne Auflistung der Ressource an die Arbeit.

https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-protocols-oauth-client-creds.

Es gibt ein zusätzliches Dokument speziell für die zweibeinige Authentifizierung für MS Graph, das im Beispiel die 'Ressource' verwendet.

https://developer.microsoft.com/en-us/graph/docs/authorization/app_only

Viel Spaß beim Suchen!

0

Es scheint so zu sein, dass vom v1-Endpunkt ausgegebene Token für einige Anfragen mit MS Graph API nicht gültig sind.

Versuchen Sie stattdessen, das Token vom v2-Endpunkt abzurufen, indem Sie https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token aufrufen.

Falls Sie mit Dokumenten OIDC Entdeckung arbeiten, werden Sie die eine für v2 bei https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration