2017-08-09 178 views
0

我正在尝试使用OAuth2访问Exchange邮箱,但我遇到了OAuth协议的问题。我没有使用库,只是直接http调用(使用libcurl)。我使用的是在这里找到的文档:无法使用OAuth2与Exchange获取访问令牌

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登录屏幕。他输入他的凭证,然后被要求批准访问所请求的范围。他这样做。接下来,在重定向URL,我们收到的数据:

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

获得令牌:

申请后提取数据 “码=”,再上岗到这个网址:

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呃ror 400,返回的数据是:

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

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

回答

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

让我知道这是否能解决您的问题。

+0

感谢您的意见。我一直在尝试两个端点,使用我在应用程序注册门户和Azure管理门户中完成的注册。在我的测试中,我确实使用了非2.0端点和在Azure门户中创建的应用程序。还是行不通。我确实尝试添加“资源”,尽管它表示可选。如果我使用Azure打开支持案例,是否可以帮助解决这类问题?有很多移动部件 - 我想我需要一些深入的咨询,任何帮助表示赞赏。 –

+0

嗨,杰夫,如果你尝试过不同的事情,你需要发布具体的错误信息和结果你在这些不同的步骤。没有这些细节,很难帮助调试您的情况。如果您可以使用** right **端点更新您的原始消息,并且会产生错误,这将有很大帮助。此外,我们应该在我们的[GitHub here](https://github.com/azure-samples)上完整地处理样品。 –

+0

好的,我编辑了原文,准确反映了我发布的内容和地点。 –

相关问题