重定向URI与Outlook MAIL REST API无效

时间:2019-02-08 11:00:23

标签: azure redirect oauth-2.0 outlook coldfusion

我希望有人能帮上忙,我完全被困住了。


先决条件

我有一个有效的Coldfusion应用程序(基于Web),并已实施了完整的Google Oauth2验证过程。这很好用,我可以在发布命令后检索电子邮件。现在,我想对Microsoft Outlook进行同样的操作


问题

当我尝试对令牌URL进行HTTP POST请求时,我得到的响应是我的重定向URI无效,因为它与我用来获取代码的重定向URI不同。


什么有效

我可以通过对oauth端点执行GET请求来检索代码。我在azure门户中添加了重定向URI(多个uri)。当我调用此URL时,我从Outlook中获得了一个登录屏幕,然后我成功被重定向回我的应用程序。因此,我认为重定向URI是正确的,并且一切正常。

当我尝试使用接收到的代码获取令牌时,出现重定向错误。我完全不知道这些URI不一样的事实。我已经对所有内容进行了三重检查,但找不到任何错误。


错误

这是我得到的错误: “ error”:“ invalid_grant”,“ error_description”:“ AADSTS70000:为“ redirect_uri”提供的值无效。该值必须与用于获取授权码的重定向URI完全匹配。

我尝试了多种格式。短划线或无破折号。但是事实仍然存在,重定向URL在前面的步骤中起作用。那么为什么不使用这个呢?

当我使用它时,我还会收到诸如“代码已过期”之类的消息,因此我知道它可以正常工作。我在Azure门户中试用了各种选项。我跟随了oauth2 Outlook游乐场。但是我仍然无法摆脱这个信息。我怎么知道这里发生了什么?

请求

我尝试了不同的方式来执行请求。最简单的一个就是这个:

cfhttp(method="POST", charset="utf-8", url="https://login.microsoftonline.com/common/oauth2/v2.0/token", result="result") {
cfhttpparam(name="Content-Type", type="header", value="application/x-www-form-urlencoded");
cfhttpparam(name="grant_type", type="formfield", value="authorization_code");
cfhttpparam(name="code", type="formfield", value="M090efafb-1ce6-1d54-fda7-e48f57c33cba");
cfhttpparam(name="scope", type="formfield", value="openid offline_access profile https://outlook.office.com/mail.read https://outlook.office.com/mail.read.shared https://outlook.office.com/mail.readwrite https://outlook.office.com/mail.readwrite.shared https://outlook.office.com/mail.send https://outlook.office.com/mail.send.shared");
cfhttpparam(name="redirect_uri", type="formfield", value="#URLencode('https://bizz.bmk-is.nl/')#");
cfhttpparam(name="client_id", type="formfield", value="cdee5a0a-a409-4c41-9572-726c5bdbe93e");
cfhttpparam(name="client_secret", type="formfield", value="[HIDDEN VALUE]");
            }

##新编辑##

我将在此处发布更多信息。首先,这是我正在使用的功能:

response_url = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize";
response_url = "#response_url#?response_type=code";
response_url = "#response_url#&client_id=cdee5a0a-a409-4c41-9572-726c5bdbe93e";
response_url = "#response_url#&redirect_url=#URLencode('https://bizz.bmk-is.nl/')#";
response_url = "#response_url#&scope=openid offline_access profile";
response_url = "#response_url# https://outlook.office.com/mail.read";
response_url = "#response_url# https://outlook.office.com/mail.read.shared";
response_url = "#response_url# https://outlook.office.com/mail.readwrite";
response_url = "#response_url# https://outlook.office.com/mail.readwrite.shared";
response_url = "#response_url# https://outlook.office.com/mail.send";
response_url = "#response_url# https://outlook.office.com/mail.send.shared&prompt=login";

这是我现在得到的错误: “ error”:“ invalid_request”,“ error_description”:“ AADSTS90102:'redirect_uri'值必须是有效的绝对Uri。

2 个答案:

答案 0 :(得分:1)

您可能需要对'redirect_uri'进行URL编码。

这里是MS Outlook REST入门页面中的示例。注意URI上的编码:

GET https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=<CLIENT ID>&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F&response_type=code&scope=openid+Mail.Read

然后获取AccessToken:

POST https://login.microsoftonline.com/common/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=AwABAAAA...cZZ6IgAA&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F&client_id=<CLIENT ID>&client_secret=<CLIENT SECRET>

答案 1 :(得分:0)

OMG我找到了!当我发现在get中将其称为“ redirect url”以及在帖子“ redirect uri”中,我正在四处搜索并使用重定向uri。将其更改为uri,现在可以使用了!超好。仍然很奇怪,在重定向URL没问题的过程中我没有收到错误,但是嘿,我很高兴它能正常工作。