5

我正在尝试通过 JavaScript 与 adal.js 和 jQuery(OAuth 隐式流)集成到 Office365 API,但在尝试为我的用户创建日历事件时遇到问题。我现有的代码在检索电子邮件和日历事件时工作正常,但是当我尝试创建日历事件时,我始终收到“403 - 禁止”响应。

该代码在http://oauth.idippedut.dk/oauth.html上运行并运行。我正在https://outlook.office.com/api/v2.0/me/events访问 Office 365 API 端点。

我在我们的 Office365/Azure 租户 Active Directory 中对应用程序的“委派权限”的配置是这样的: 在此处输入图像描述

我们的 Office365/Azure 租户 Active Directory 中应用程序的“应用程序权限”配置如下: 在此处输入图像描述

jQuery 请求是这样的:

var event = {
    "Subject": "Discuss the Calendar REST API",
    "Body": {
        "ContentType": "HTML",
        "Content": "I think it will meet our requirements!"
    },
    "Start": {
        "DateTime": "2016-01-21T18:00:00",
        "TimeZone": "Pacific Standard Time"
    },
    "End": {
        "DateTime": "2016-01-21T19:00:00",
        "TimeZone": "Pacific Standard Time"
    },
    "Attendees": [
        {
            "EmailAddress": {
                "Address": "jesper@lundstocholm.dk",
                "Name": "Janet Schorr"
            },
            "Type": "Required"
        }
    ]
};

// Create calendar events
jQuery.ajax({
    type: 'POST',
    url: postCalenderEndpoint,
    data: JSON.stringify(event),
    contentType: "application/json",
    headers: {
        'Accept': 'application/json',
        'Authorization': 'Bearer ' + token,
    },

}).done(function (data) {
    //alert(JSON.stringify(data));
}).fail(function (err) {
    jQuery("#loginMessage").text('Error calling REST endpoint: ' + err.statusText + '\n' + err.responseText);
});

jQuery的配置是这样的:

var resource = 'https://outlook.office.com';
var postCalenderEndpoint = 'https://outlook.office.com/api/v2.0/me/events';
var clientID = '28a707a5-0f11-4d93-8b88-6a918544da14';
var tenantName = '365projectum.onmicrosoft.com';
var authContext = new AuthenticationContext({
    instance: 'https://login.microsoftonline.com/',
    tenant: tenantName,
    clientId: clientID,
    postLogoutRedirectUri: window.location.origin,
    cacheLocation: 'localStorage'
});

生成的 HTTP 请求是这样的:

Host: outlook.office.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: application/json
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json; charset=UTF-8
Authorization: Bearer <my token>
Referer: http://oauth.idippedut.dk/oauth.html
Content-Length: 386
Origin: http://oauth.idippedut.dk
Connection: keep-alive

{"Subject":"Discuss the Calendar REST API","Body":{"ContentType":"HTML","Content":"I think it will meet our requirements!"},"Start":{"DateTime":"2016-01-21T18:00:00","TimeZone":"Pacific Standard Time"},"End":{"DateTime":"2016-01-21T19:00:00","TimeZone":"Pacific Standard Time"},"Attendees":[{"EmailAddress":{"Address":"jesper@lundstocholm.dk","Name":"Janet Schorr"},"Type":"Required"}]}

我真的很困惑为什么我会得到 403,因为一切都应该正确设置。

任何帮助将不胜感激 :-)

/杰斯珀

4

3 回答 3

2

您为 Microsoft Graph 配置了委派权限,但调用了 Outlook 终结点。您需要执行以下任一操作: 1. 将您的应用配置更改为拥有 Outlook/Office 365 Exchange Online 的委派权限。2. 更改您的应用程序以使用 Microsoft Graph 端点 (graph.microsoft.com),即https://graph.microsoft.com/v1.0/me/events并保留当前应用程序配置。

于 2016-01-22T03:36:42.557 回答
1

尝试“ https://graph.microsoft.com ”作为获取(正确)令牌的资源。

此致,

阿杰

于 2016-01-21T11:33:02.473 回答
0

您是否最初注册了请求“读取用户和共享日历”权限的应用程序,然后添加了“对用户日历具有完全访问权限”权限?如果是,则您可能处于用户已同意前一个权限的情况,并且由于该同意已经到位,他们永远不会被进一步要求同意您添加的新权限。这可以解释为什么您的应用程序可以读取,但不能写入。

只有在添加新权限之前同意的用户才会出现这种情况,并且只有在用户实际上同意的情况下。如果您将应用程序注册为管理员,并且与管理员在同一租户中的用户登录,则用户无需同意。如果您将应用程序注册为普通用户,或者该应用程序是多租户应用程序,则用户必须同意。

如果是这两种情况中的任何一种,查看这是否是问题的简单方法是尝试以以前未同意的全新用户身份使用该应用程序。这个新用户将同意应用程序请求的所有权限。请注意,如果这是一个管理员同意的应用程序,那么您将需要一个全新的租户来同意。

如果这确实解决了问题,那么您需要让现有用户完成使用 prompt=consent 参数发送新的 OAuth 授权请求的步骤,以让他们再次同意。

于 2017-04-23T21:44:09.203 回答