【问题标题】:Microsoft GraphAPI 403 error getting users' events in SPfx app在 SPfx 应用程序中获取用户事件的 Microsoft Graph API 403 错误
【发布时间】:2020-05-03 16:35:47
【问题描述】:

我使用 Microsoft GraphAPI 编写了一个托管在 SharePoint Online 上的 SharePoint SPfx 应用程序,以获取用户个人资料信息和日历事件。根据微软文档,我在 package-solution.json 文件中声明了我的范围,并通过 SharePoint APi 管理页面批准了请求。我可以阅读每个人的个人资料信息,但是,当我尝试访问日历活动但我自己的活动时,我收到错误 403。用户的日历不是私人的,它们对整个组织开放。

Package-solution.json 权限请求

"webApiPermissionRequests": [
      {
        "resource": "Microsoft Graph",
        "scope": "User.Read"
      },
      {
        "resource": "Microsoft Graph",
        "scope": "User.ReadBasic.All"
      },
      {
        "resource": "Microsoft Graph",
        "scope": "People.Read"
      },
      {
        "resource": "Microsoft Graph",
        "scope": "Calendars.Read"
      }
    ]
  }

管理员批准的请求图片

Screen of approved app permissions

请求代码:

private _searchUserCalendar(keyword: string): Promise<any[]> {
    console.log("connection to GraphAPI event domain")
    return new Promise<any[]>((resolve, reject) => {
      this._context.msGraphClientFactory.getClient()
        .then((client: MSGraphClient): void => {
          client
            .api(`/users/${keyword}/calendar/events`) // The api i.e> /me | /users
            .version('v1.0')
            .select("showAs,start,subject, end")
            .top(5)
            .get((error, response: any, rawResponse?: any) => {
              if (error) {
                console.log("ooops somethign went wrong get events",error);
                reject(error);
              }
              var users:Array<any>=new Array<any>();

              // Map the JSON response to the output array
              if (response != null && response != undefined) {
                console.log(response);
                response.value.map((item: any) => {
                  console.log("found events for:", item)
                }); // mapping over users
              }
              resolve(users);  

            });
        });
    });
  }

错误响应

{error: {code: "ErrorAccessDenied", message: "Access is denied. Check credentials and try again.",…}}
error: {code: "ErrorAccessDenied", message: "Access is denied. Check credentials and try again.",…}
code: "ErrorAccessDenied"
message: "Access is denied. Check credentials and try again."
innerError: {request-id: "5dca3d4f-ab4c-4237-8ff4-78d8cacbd43b", date: "2020-01-16T19:05:26"}
request-id: "5dca3d4f-ab4c-4237-8ff4-78d8cacbd43b"
date: "2020-01-16T19:05:26"

我已经尝试了一切,任何帮助将不胜感激。

  • 我在图形浏览器上测试了我的请求,效果很好
  • 我卸载/重新安装了应用程序
  • 我在 API 管理仪表板上拒绝并重新批准了权限请求
  • 我将请求 URL 从使用用户 ID 更改为使用电子邮件(仅适用于我的个人资料,但仍不适用于其他任何人)
  • 我让用户与我共享他们的日历并授予读/写权限,但仍然无法正常工作,因为该权限是特定于应用程序的,而不是用户委托的。

【问题讨论】:

  • 你能添加对你做过的事情的描述吗?
  • @Fred 我用我尝试过的列表编辑了我的帖子,如果您需要任何其他说明,请告诉我

标签: sharepoint microsoft-graph-api spfx


【解决方案1】:

User.ReadUser.ReadBasic.All 无权执行您正在尝试执行的操作。

这个URL 谈论日历阅读共享事件。

例如,Garth 与 John 共享了他的默认日历并授予 John 读取权限。如果 John 已登录您的应用并提供委派权限(Calendars.Read.Shared 或 Calendars.ReadWrite.Shared),您的应用将能够访问 Garth 的默认日历和该日历中的事件,如下所述。

你可以尝试添加Calendar.Read.Shared

【讨论】:

  • hmmm...我实际上能够很好地阅读每个人的个人资料信息。也许我应该在描述中说出来。我只是在访问事件时遇到问题。 Calendars.Read.Shared 每个文档将显示共享事件,Calendars.read 将仅显示用户的事件。但是,此时我很绝望,所以我会尝试一下。感谢您的建议
  • 您拥有User.ReadBasic.All,它会为您提供基本的个人资料信息(显示名称、名字和姓氏、电子邮件地址、打开的扩展程序和照片)。您需要更多权限(例如User.Read.AllCalender.Read.Shared ) 以访问更多信息
  • 你可能是对的,我正在将新的更新推送到权限,如果有效我会继续发布
【解决方案2】:

在尝试了不同的权限范围(包括@chad 建议的权限范围)后,Calendar.Read.Shared 似乎起作用了。但是,它之所以有效,是因为它是一种委派权限,用户必须隐式地与整个组织或登录用户共享他们的日历。这是误导性的,并且与我在 graphAPI 文档中看到的相反 here 在日历 > 应用权限下:

日历。阅读 |阅读所有邮箱中的日历 允许该应用阅读 没有登录用户的所有日历的事件。

...和

日历.Read.Shared |读取用户和共享日历 允许该应用 读取用户可以访问的所有日历中的事件,包括 委托和共享日历。

因此,根据前面的陈述,我只需要 Calendars.Read 即可读取该用户创建的用户日历中的所有事件。使用 Calendars.Read.Shared 的逻辑是同时读取用户共享的所有事件,包括那些未创建但与用户共享的事件。

最后,我将此标记为已回答,因为它是唯一对我有用的东西(在某种程度上),而不是因为它解决了最初的问题。关于这个主题的文档是矛盾的和令人困惑的。现在这是我的答案,除非 Microsoft 更改了某些内容或澄清了问题,或者您发现了其他内容或/并且我的逻辑有缺陷。如果我的逻辑和理解有缺陷,请发表回复并告诉我。毕竟,这就是社区的目的。

谢谢

【讨论】:

    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 2023-01-30
    • 2023-04-06
    • 2017-05-19
    • 2020-07-25
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多