2017-09-16 3 views
1

Je passe un moment absolument horrible à essayer d'utiliser Outlook 365 API. Mon cas d'utilisation est très simple: créez un script qui s'exécutera toutes les heures pour extraire des informations sur le calendrier d'un utilisateur.Outlook 365 api - Authentification

Mon script s'exécute en python et j'ai pu obtenir un jeton, mais je suis incapable d'obtenir les événements de l'utilisateur. J'ai évidemment enregistré mon application dans le Microsoft Application Registration Portal et donné l'autorisation d'application Calendar.read. Un administrateur a également donné son consentement en accédant au point de terminaison /adminconsent.

Voici mon code pour obtenir le jeton (documentation here):

url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token' 
data = { 
    'grant_type': 'client_credentials', 
    'client_id': app_id, 
    'scope': 'https://graph.microsoft.com/.default', <--- Really not sure about this here 
    'client_secret': client_secret, 
} 
r = requests.post(url, data=data) 
token = r.json().get('access_token') 

Quel champ suis-je censé utiliser? La documentation ne parle que de celle ci-dessus.

Et pour lire le calendrier de l'utilisateur:

url = 'https://outlook.office.com/api/v2.0/users/{}/events'.format(user_email) 
headers = { 
    'Authorization': 'Bearer {}'.format(token) 
} 
r = requests.get(url, headers=headers) 

Encore une fois, je ne suis vraiment pas sûr de la partie users/{user_email}/. J'ai lu un gars sur stackoverflow qui a fait quelque chose de similaire mais ne pouvait pas le trouver n'importe où dans le doc.

Je suis en mesure d'obtenir un jeton d'accès, mais je reçois l'erreur suivante lorsque vous essayez de lire le calendrier de l'utilisateur:

réponse [401]

Le jeton d'accès est acquis à l'aide d'une méthode d'authentification est trop faible pour autoriser l'accès à cette application. La force d'autorisation présentée était 1, requise est 2.

S'il vous plaît oh s'il vous plaît stackoverflow, aidez-moi. J'ai déjà passé trop de temps à faire cette tâche très simple.

Répondre

0

Je l'ai enfin trouvé. J'étais très proche.

J'ai dû utiliser le point de terminaison de l'API Microsoft Graph au lieu du point de terminaison de l'API Outlook unifiée.

Le code final ressemble à:

import requests 

# Get a token 
url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token' 
data = { 
    'grant_type': 'client_credentials', 
    'client_id': app_id, 
    'scope': 'https://graph.microsoft.com/.default' 
    'client_secret': client_secret, 
} 
r = requests.post(url, data=data) 
token = r.json().get('access_token') 

# ... 

# Use the token using microsoft graph endpoints 
url = 'https://graph.microsoft.com/v1.0/users/{}/events'.format(user_email) # can also use the user_id (e.g. 12345-abcde-...) 
headers = { 
    'Authorization': 'Bearer {}'.format(token) 
} 
r = requests.get(url, headers=headers) 

documentation de Microsoft a vraiment besoin de précisions. Il a trop d'API différentes qui font des choses très similaires.

+0

Merci pour les commentaires Fabrice. Le graphique est absolument l'API recommandée à utiliser. Il utilise réellement le point de terminaison Outlook sous les couvertures. Nous avons un document ici qui tente d'expliquer la différence et pourquoi vous pouvez choisir l'un sur l'autre: https://docs.microsoft.com/en-us/outlook/rest/compare-graph-outlook. Nous travaillons sur l'unification de l'histoire de l'API REST pour être super-clair que Graph est le moyen préféré. –

+0

Cool. Merci pour votre commentaire. Je suppose que c'est le moment où vous essayez de passer d'une version à l'autre, d'où ma dernière phrase. –