Outlook 365 中的身份验证 api

Authentication in Outlook 365 api

我的用例是:制作一个脚本,每小时 运行 提取有关用户日历的信息。

我的脚本 运行s 在 Python 中,我得到了一个令牌,但我无法获得用户的事件。我已经在 Microsoft Application Registration Portal 中注册了我的应用程序并获得了 Calendar.read 应用程序权限。管理员通过访问 /adminconsent 端点表示同意。

这是我获取令牌的代码(文档 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')

我应该使用什么范围?文档只说了上面那个。

并读取用户的日历:

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

我不确定 users/{user_email}/ 部分。

我获得了访问令牌,但在尝试读取用户的日历时出现以下错误:

Response [401]

The access token is acquired using an authentication method that is too weak to allow access for this application. Presented auth strength was 1, required is 2.

终于找到了。我非常接近。

我必须使用 Microsoft Graph API 端点而不是 Outlook Unified API 端点。

最终代码如下:

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)

Microsoft 的文档确实需要说明。它有太多不同的 API 做非常相似的事情。