【问题标题】:Cannot obtain access token using OAuth2 with Exchange无法通过 Exchange 使用 OAuth2 获取访问令牌
【发布时间】:2017-09-07 05:19:21
【问题描述】:

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

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

我已经成功获取了授权码,现在我正在尝试使用它来获取访问令牌。返回的 json 中的响应是“invalid grant, Transmission data parser failure: Authorization Code is malformed or invalid.”。 HTTP 错误 400。下面是我生成的整个流程:

获取验证码:

用这个 url 启动 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

获取令牌:

应用程序在“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 中的应用程序配置。

【问题讨论】:

    标签: azure exchangewebservices azure-active-directory


    【解决方案1】:

    我相信您将 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

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

    【讨论】:

    • 感谢您的 cmets。我一直在尝试这两个端点,使用我在应用程序注册门户和 Azure 管理门户中完成的注册。在我的测试中,我确实将非 2.0 端点与在 Azure 门户中创建的应用程序一起使用。还是行不通。我确实尝试添加“资源”,即使它说是可选的。如果我使用 Azure 打开支持案例,我可以得到帮助吗?有很多活动部件 - 我想我需要一些深入的咨询,感谢任何帮助。
    • 您好 Jeff,如果您尝试了不同的方法,则需要发布在这些不同步骤中获得的特定错误消息和结果。如果没有这些细节,很难帮助调试您的情况。如果您可以使用 right 端点更新原始消息以及导致的错误,那将有很大帮助。此外,我们的GitHub here 上应该有完整的端到端样本。
    • 好的,我已经编辑了原始帖子以准确反映我发布的内容和位置。
    猜你喜欢
    • 2011-10-04
    • 2015-02-11
    • 2017-12-10
    • 1970-01-01
    • 2020-09-10
    • 2014-09-04
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多