我正在构建一个页面,其中有许多调用Microsoft Graph到不同的端点:获取OneDrive文件,电子邮件,用户属性等。
无效的一个电话是获取当前用户的日历事件。我正在使用的终点是https://graph.microsoft.com/v1.0/me/events
。回复是403 Forbidden。
根据Microsoft文档here,应用程序需要Calendars.Read
或Calendars.ReadWrite
权限。我在委派的权限下检查了这两个权限,但仍然存在同样的问题。然后,我为此应用程序勾选了Azure AD中的所有51个权限范围,但问题仍然存在。
我也尝试在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
}
答案 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)。