使用OAuth2和Exchange无法获取访问令牌

时间:2017-08-09 23:25:04

标签: azure exchangewebservices azure-active-directory

我正在尝试使用OAuth2访问Exchange邮箱,但我遇到了OAuth协议的问题。我没有使用库,只是直接进行http调用(使用libcurl)。我正在使用此处找到的文档:

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

我已成功获取授权码,现在我正在尝试使用它来获取访问令牌。返回的json中的响应是“无效授权,传输数据解析器失败:授权代码格式错误或无效。”。 HTTP错误400.以下是我正在生成的整个流程:

获取验证码:

使用此网址启动IE:

https://login.microsoftonline.com/common/oauth2/authorize?client_id=38f1da80-9f80-4ff6-84a8-27c83d7212d3&redirect_uri=https%3A%2F%2Flogin.microsoftonline.com%2Fcommon%2Foauth2%2Fnativeclient&resource=https%3A%2F%2Foutlook.office.com%2F&response_type=code&scope=openid+Mail.ReadWrite

此时,将向用户显示Microsoft登录屏幕。他输入凭证,然后被要求批准访问所请求的范围。他这样做了。接下来,在重定向网址,我们会收到以下数据:

https://login.microsoftonline.com/common/oauth2/nativeclient?code=AQABAAIAAAA9kTklhVy7SJTGAzR-p1BcUmXu0izUoOslqxHN85yR0vAVKicFVbtjs3IsKScxeBuTmxBsVy8qT3axn5YaDt_O6M4YVcAk--kpJ-dnNbKtnovjHIxGwtdRawo53UU9u19YP5ST5a8Ekffnxh0Z2gbBM_sKbmbhx2E-y_xs1spgV8gF6im39tLWo

获取令牌:

应用程序在“code =”之后提取数据,然后发布到此URL:

https://login.microsoftonline.com/common/oauth2/token

这个数据:

grant_type=authorization_code&client_id=38f1da80-9f80-4ff6-84a8-27c83d7212d3&code=AQABAAIAAAA9kTklhVy7SJTGAzR-p1BcUmXu0izUoOslqxHN85yR0vAVKicFVbtjs3IsKScxeBuTmxBsVy8qT3axn5YaDt_O6M4YVcAk--kpJ-dnNbKtnovjHIxGwtdRawo53UU9u19YP5ST5a8Ekffnxh0Z2gbBM_sKbmbhx2E-y_xs1spgV8gF6im39tLWo&redirect_uri=https%3A%2F%2Flogin.microsoftonline.com%2Fcommon%2Foauth2%2Fnativeclient&resource=https%3A%2F%2Foutlook.office.com%2F

此帖子导致http错误400,返回的数据为:

{"error":"invalid_grant","error_description":"AADSTS70000: Transmission data parser failure:Authorization Code is malformed or invalid....}

任何人都可以看看我做了什么,并建议我哪里出错了?另外,我尝试运行Shawn建议的Powershell脚本 - 此脚本使用我现有的应用程序ID并使用ADAL获取授权代码和令牌。这似乎有效,所以我怀疑问题出在我的代码中,而不是Azure中的应用程序配置。

1 个答案:

答案 0 :(得分:0)

我相信您正在将Azure Active Directory V2端点与V1端点进行混合。

具体来说,您已链接并说您正在关注的文档适用于AAD V1端点并使用以下URL(如文档所述):

https://login.microsoftonline.com/{tenant}/oauth2/authorize

https://login.microsoftonline.com/{tenant}/oauth2/token

  

注意:网址中没有/v2.0/

我在令牌请求中看到的另一个问题是您没有指定resource。我相信如果您想获取特定资源的访问令牌,则需要这样做。对于Exchange Online,您需要指定资源https://outlook.office.com/

请注意,如果可能,Office 365建议您直接使用Microsoft Graph(https://graph.microsoft.com/)而不是Exchange API。如果你对此没问题,那么你应该也可以使用AAD V2端点。与上面列出的V2端点相同的文章是here

如果这可以解决您的问题,请告诉我。