oauth-2.0 - 使用 Microsoft Graph 创建日历事件:ErrorAccessDenied
问题描述
我一直在使用 curl 和 Outlook REST API v1.0(带有基本身份验证)在 Outlook 日历中创建日历事件。基本身份验证即将被弃用,因此我现在尝试使用 OAuth 2 迁移到 Microsoft Graph v1.0。我已经取得了一些进展,但在运行 POST 以创建事件时卡在“ErrorAccessDenied”。这是我到目前为止所做的:
在此处注册我的应用程序(curl):https ://apps.dev.microsoft.com/#/appList ,将 Application Permissions 设置为 Calendars.ReadWrite (并且,为了更好地衡量,Delegated Permissions 也设置为 Calendars.ReadWrite。)
使用上面步骤 1 中的客户端/应用程序 ID 和客户端密码/密码,我可以使用以下命令获取访问令牌:
curl -X POST -k -d "grant_type=client_credentials&client_id=[ApplicationID]&client_secret=[Password]&resource=https%3A%2F%2Fgraph.microsoft.com%2F" https://login.microsoftonline.com/[TenantID] /oauth2/令牌
- 然后我尝试使用以下命令创建一个事件,但得到下面的 ErrorAccessDenied 错误:
curl.exe -k -o "C:\Temp\output.txt" -X POST -H "Content-Type:application/json" -H "授权:承载 [TOKEN]" -d @"C:\Temp\ eventDetails.json" https://graph.microsoft.com/v1.0/users/[UserPrincipalName]/calendars/[CalendarID]/events ?$select=Id,lastModifiedDateTime
{ "error": { "code": "ErrorAccessDenied", "message": "访问被拒绝。检查凭据并重试。", "innerError": { "request-id": "38b802b9-08b9-4e0b-8f91 -66ef56c459f8", "日期": "2018-10-17T01:08:22" } } }
除了将注册应用程序的应用程序权限设置为 Calendars.ReadWrite (上面的第 1 步)之外,我对如何允许访问感到茫然。任何帮助将不胜感激。
谢谢你。
解决方案
对我有很大帮助的是使用 JWT 检查网站检查令牌,例如JWT.ms。本网站将向您解释有关令牌的所有详细信息(由 Microsoft 构建,令牌仅由 javascript 解析,不传输)。该网站还有一个声明选项卡,其中解释了令牌中的所有声明。
您正在谈论应用程序权限,这需要一个额外的步骤。它还必须得到 Azure AD 管理员的同意才能访问您要访问的目录。
您可以将其构建到登录流程中,但最简单的方法是通过 Azure 门户。
- 转到https://portal.azure.com -> Azure Active Directory -> [AD 名称] - 应用注册
- 找到您要授予访问权限的应用程序。
- 单击设置
- 单击所需权限
- 单击授予权限
这样做是在您的租户中创建一个具有您请求的权限的应用程序帐户。
在这些步骤之后,您应该创建一个新令牌并将其与您第一次获得的令牌进行比较,您应该能够看到更改。
推荐阅读
- c# - 关于在 Blazor 中使用 ValueTask 的 CA2012 警告。如何在 Blazor 中正确实现“一劳永逸”?
- php - Laravel 8. 我可以为一个请求按日期获取一系列商店收入吗?
- angular - 将 Angular 编译器导入 Bit 会导致依赖树问题
- browser - 如何使用代码获取 indexedDb 对象的路径
- node.js - Does Express access an app.get(/:params) if the user didn't type anything in the URL
- arrays - 对象的值在 React 状态下不会立即更新,任何人都可以解决这个问题吗?
- python - 检查二叉树是否围绕其中心对称-如何将节点值打印为调试?
- c# - 使用通用响应模型找不到路由异常
- django - cpanel是否需要外部命令才能运行redis
- swift - 异步等待调用后更新 UI