Javascript Microsoft Graph API-403禁止用于v1.0/me/events
我正在构建一个页面,其中包含许多对Microsoft Graph的调用,这些调用指向不同的端点:获取OneDrive文件、电子邮件、用户属性等 一个不起作用的调用是获取当前用户的日历事件。我使用的终点是https://graph.microsoft.com/v1.0/me/events. 响应为403禁止 根据Microsoft文档,应用程序需要Calendars.Read或Calendars.ReadWrite权限。我在委托权限下检查了这两个问题,但仍然存在相同的问题。然后我在Azure广告中勾选了该应用程序的所有51个权限范围,但仍然存在相同的问题 我还尝试在Azure广告中创建一个新应用程序,但这没有帮助 如何使用Microsoft Graph返回当前用户的日历事件?我错过了什么 编辑: 我正在使用ADAL.js进行身份验证。这是我自己的doAuth函数中的代码,它接受应用程序的客户机IDJavascript Microsoft Graph API-403禁止用于v1.0/me/events,javascript,jquery,calendar,office365,microsoft-graph-api,Javascript,Jquery,Calendar,Office365,Microsoft Graph Api,我正在构建一个页面,其中包含许多对Microsoft Graph的调用,这些调用指向不同的端点:获取OneDrive文件、电子邮件、用户属性等 一个不起作用的调用是获取当前用户的日历事件。我使用的终点是https://graph.microsoft.com/v1.0/me/events. 响应为403禁止 根据Microsoft文档,应用程序需要Calendars.Read或Calendars.ReadWrite权限。我在委托权限下检查了这两个问题,但仍然存在相同的问题。然后我在Azure广告中
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
}
听起来您已经更改了分配给应用程序的作用域。当这种情况发生时,您还需要让用户使用这些新作用域重新授权。为此,向初始ODATA重定向的查询字符串添加&prompt=approve。这将迫使您的新作用域呈现给用户进行授权 您可以在ADAL.js库中使用配置中的extraQueryParameter参数触发此操作:
// 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"
}
最后,我没能弄明白这一点,最终使用了Exchange API,而不是邮件、日历和任务的图形任务无论如何都需要Exchange API,由于这目前仅在beta Graph API中可用。您是否检查了从login.microsoftonline.com返回的JWT令牌是否包含所需的作用域?@RasmusW您能否解释一下我如何检查令牌的作用域?有没有一种方法需要在AuthenticationContext对象上使用?我只是想手动执行。您可以通过jwt.io或jwt.caleb.net等网站为您解码。最后一个甚至包括了一些关于每个属性的文档,如果它们是标准JWT的话。如何检查从login.microsoftonline.com返回的JSON对象?Marc,你能解释一下我是如何向查询字符串添加&prompt=approve的吗?我用的是ADALjs。我将用代码更新我的问题。我已将此步骤添加到我的答案中。希望有帮助。