我正在尝试使用Microsoft Graph API查询Outlook / O365邮箱中的邮件。我是Azure门户网站中的registered my app,并收到了查询API的必要信息。该应用程序具有Mail.Read
权限。 (我无权访问Azure门户,我被告知它是以这种方式设置的。)但是,当我从OAuth端点获取令牌时,它在任何后续调用中都不起作用。我正在使用Python的请求模块进行测试。
为什么这个电话失败了?好像我传递了所有正确的信息,但我显然遗漏了一些东西。
我通过执行POST
获取令牌:
https://login.microsoftonline.com/my.domain/oauth2/token
我传递了必要的参数:
data = {'grant_type': 'client_credentials', 'client_id': CLIENTID, 'client_secret': SECRET, 'resource': APPURI}
我收到这样的回复:
{
'resource': 'APPURI',
'expires_in': '3599',
'ext_expires_in': '3600',
'access_token': 'TOKENHERE',
'expires_on': '1466179206',
'not_before': '1466175306',
'token_type': 'Bearer'
}
但是,我尝试使用该令牌,但它不适用于我所称的任何内容。我将它作为标题传递:
h = {'Authorization': 'Bearer ' + TOKEN}
我正在调用此网址:
url = 'https://graph.microsoft.com/v1.0/users/[email protected]/messages'
具体来说,我用这个:
r = requests.get(url, headers=h)
回复是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.'
}
}
在您的登录请求中,资源参数应为https://graph.microsoft.com
我想你需要从这里注册app“https://apps.dev.microsoft.com”而不是Azure Portal。
除非您使用的是Client Credentials,否则您无法访问其他帐户邮箱的邮件。确保[email protected]
与您通过身份验证的帐户相同,并且此地址也是该帐户的userPrincipalName。
您还可以使用简化的URI来请求您的消息,并绕过使用userPrincipalName
确定帐户的/me
。在这种情况下,GET
请求将是https://graph.microsoft.com/v1.0/me/messages
似乎是这样的,从v1端点发出的令牌对于至少一些使用MS Graph API的请求是无效的。
而是通过调用https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
尝试从v2端点获取令牌。
如果您正在使用oidc发现文档,您将在https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration
找到v2的文件
值得注意的是,即使MS的Azure文档没有指定列出资源的需要,我也无法在没有列出资源的情况下开始工作。
有一个补充文档,专门针对MS Graph的双腿Auth实际使用示例中的“资源”。
https://developer.microsoft.com/en-us/graph/docs/authorization/app_only
快乐狩猎!