从 Teams 选项卡调用 SharePoint REST API

Call SharePoint REST API from Teams Tab

我有一个 Teams Tab 应用程序需要对团队的网站进行一些操作。 用户需要进行身份验证,所有操作都代表用户执行。

调用图表 API 有一些记录,我在这里找到了一篇很好的文章,例如: https://bob1german.com/2020/08/31/calling-microsoft-graph-from-your-teams-application-part3/

但我想直接调用 SharePoint REST API,而不是通过图形 API,因为我想执行一些图形 API 不支持的操作(还?) , 比如创建一个页面。

我怎样才能做到这一点?

据我所知,我需要将从团队获得的令牌交换为另一个可用于调用 SharePoint 的令牌。 (on_behalf_of 流量)。我将 SharePoint 的范围添加到应用程序注册中,并在交换令牌时请求这些范围(例如 https://microsoft.sharepoint-df.com/AllSites.Read)。但我一直收到 401 访问被拒绝。

请注意,这与调用图 API 无关。这是关于“正常”的 SharePoint REST API。对于调用图 API 它有效。

更多详细信息和 REST 调用: https://gist.github.com/nbelyh/ec17a4e398069e35c2a2a5dc4447fb2a

在我看来,可以通过 http 请求通过访问令牌访问 SharePoint api。所以如果你实现了调用graphapi的功能,我觉得操作是差不多的。首先创建azure ad application和create client secret,然后根据需要调用的api添加application,最后使用client credential flow或者其他合适的流程来生成access token。

或者你说的'not through the graph API'就是我上面说的意思?如果我理解有误,请指出,我认为最好告诉我们你想打电话给哪个api。

==========================更新================== ==========

根据您在评论中提供的link,我发现其中的apis(例如GetSite:https://graph.microsoft.com/v1.0/sites/root)需要api权限'graph->Sites.ReadWrite.All'(都是图api),所以生成access token的时候需要在scope里面加上,当然首先要加上api权限在蔚蓝的门户中。然后你可以调用 api.

我不确定“代表流程”与“仅应用程序”流程是否重要,但根据我的实验,为图形调用获取令牌与为 SP 休息调用获取令牌不同。

具体来说,端点并不相同。这是我如何从失眠中执行休息请求:

我想关键是使用 https://accounts.accesscontrol.windows.net/{{ tenantId }}/tokens/OAuth/2 而不是 https://login.microsoftonline.com/{{ tenantId }}/oauth2/v2.0/token

感谢@JeremyKelley-Microsoft 的回答,只是张贴在这里供其他人使用:

您需要使用 https://{tenant}/AllSites.Read(或 https://{tenant}/.default)作为范围,它确实有效。 {tenant} 是客户的租户。这是流程:

0。申请注册权限

1。从团队获得代币

microsoftTeams.authentication.getAuthToken() => <teams_token>

2。交易Graph Token(代流量)

POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

client_id: <**your client id**>
client_secret: <**your client secret**>
grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer
assertion: <**teams_token**>
requested_token_use: on_behalf_of,
scope: https://{tenant}/AllSites.Read

=> returns the <access_token>

3。使用访问令牌访问共享点 REST API(获取根站点)

GET https://{tenant}/_api/web

headers: 
  authorization: "bearer " + <access_token>