我尝试使用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/my.email.address@example.com/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.'
}
}
答案 0 :(得分:16)
在您的登录请求中,资源参数应为https://graph.microsoft.com
答案 1 :(得分:1)
除非您使用Client Credentials,否则您无法访问其他帐户的邮箱。确保my.email.address@example.com
与您通过身份验证的帐户相同,并且该地址也是该帐户的userPrincipalName。
您还可以使用简化的URI来请求您的邮件,并绕过使用userPrincipalName
来确定帐户/me
。在这种情况下,GET
请求将为https://graph.microsoft.com/v1.0/me/messages
答案 2 :(得分:1)
我认为你需要在这里注册应用程序" https://apps.dev.microsoft.com"而不是来自Azure门户。
答案 3 :(得分:1)
似乎是这样的,从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
答案 4 :(得分:0)
值得注意的是,即使MS的Azure文档没有指定列出资源的需要,我也无法在没有列出资源的情况下开始工作。
有一个补充文件,专门针对MS Graph的双腿Auth实际上使用了示例中的“资源”。
https://developer.microsoft.com/en-us/graph/docs/authorization/app_only
快乐狩猎!