Microsoft Graph API - 403禁止用于v1.0 / me / events

时间:2017-02-06 11:56:32

标签: javascript jquery calendar office365 microsoft-graph

我正在构建一个页面,其中有许多调用Microsoft Graph到不同的端点:获取OneDrive文件,电子邮件,用户属性等。

无效的一个电话是获取当前用户的日历事件。我正在使用的终点是https://graph.microsoft.com/v1.0/me/events。回复是403 Forbidden。

enter image description here

根据Microsoft文档here,应用程序需要Calendars.ReadCalendars.ReadWrite权限。我在委派的权限下检查了这两个权限,但仍然存在同样的问题。然后,我为此应用程序勾选了Azure AD中的所有51个权限范围,但问题仍然存在。

enter image description here

我也尝试在Azure AD中创建一个新应用,但这没有帮助。

如何使用Microsoft Graph取回当前用户的日历活动?我错过了什么?

编辑:

我正在使用ADAL.js进行身份验证。这是我自己的doAuth函数中的代码,它接收应用程序的客户端ID。

function doAuth(clientId) {
    var variables = {
        // Domain of Azure AD tenant
        azureAD: // the appropriate URL,
        // ClientId of Azure AD application principal
        clientId: clientId,
        // Name of SharePoint tenant
        sharePointTenant: // the appropriate URL
    }

    // Create config and get AuthenticationContext
    window.config = {
        tenant: variables.azureAD,
        clientId: variables.clientId,
        postLogoutRedirectUri: window.location.origin,
        endpoints: {
            graphApiUri: "https://graph.microsoft.com",
            sharePointUri: "https://" + variables.sharePointTenant + ".sharepoint.com",
        },
        cacheLocation: "localStorage"
    }

    var authContext = new AuthenticationContext(config);
    var isCallback = authContext.isCallback(window.location.hash);
    authContext.handleWindowCallback();

    if (isCallback && !authContext.getLoginError()) {

        window.location = authContext._getItem(authContext.CONSTANTS.STORAGE.LOGIN_REQUEST);
    }

    var user = authContext.getCachedUser();
    var token = authContext.getCachedToken(clientId);

    if (!user || !token)
        authContext.login();

    return authContext
}

2 个答案:

答案 0 :(得分:1)

听起来您已经更改了分配给应用程序的范围。发生这种情况时,您还需要使用这些新范围对用户进行重新授权。为此,请将&prompt=consent添加到初始ODATA重定向的查询字符串中。这将强制将您的新范围呈现给用户以进行授权。

您可以使用配置中的extraQueryParameter参数在ADAL.js库中触发此操作:

// Create config and get AuthenticationContext
window.config = {
    tenant: variables.azureAD,
    clientId: variables.clientId,
    postLogoutRedirectUri: window.location.origin,
    endpoints: {
        graphApiUri: "https://graph.microsoft.com",
        sharePointUri: "https://" + variables.sharePointTenant + ".sharepoint.com",
    },
    cacheLocation: "localStorage",
    extraQueryParameter: "prompt=consent"
}

答案 1 :(得分:0)

最后我无法解决这个问题,并最终使用Exchange API而不是Graph来处理邮件,日历和任务(无论如何,任务都需要Exchange API,因为这只是目前在beta Graph中可用的API)。