【问题标题】:Call SharePoint REST API from Teams Tab从 Teams 选项卡调用 SharePoint REST API
【发布时间】:2021-05-28 21:49:27
【问题描述】:

我有一个 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

【问题讨论】:

  • 据我记得,使用仅应用程序身份验证调用共享点休息端点需要使用证书。不允许使用 appsecret。
  • 我不想只使用应用程序调用 SharePoint,我想代表用户调用它。基本上,将我从团队获得的用户令牌换成适合调用 SharePoint REST API 的令牌。许多文章都在解释如何为图形 API 执行此操作(如描述中的文章),但我没有找到任何解释 SharePoint REST API 的文章。并且令牌似乎不兼容。或者也许我错过了什么?
  • 您是否在清单中专门使用“microsoft.sharepoint-df.com/AllSites.Read”作为您的权限?如果是这样,您需要将域替换为您的目标租户域。您可能还需要进入 Azure 门户,查看您的 Teams 应用程序是否已批准目标 SharePoint 权限。
  • @JeremyKelley-Microsoft 感谢您的评论。是的,我用过那个。但它是一个团队应用程序,应该适用于任何客户域...我的意思是,我不知道客户的域是什么,所以我不能将其添加到应用程序注册中?
  • 这可能需要来自更了解 Teams 应用流程的 Teams 团队的意见。您也可以尝试:“https://”+域+“/.default”作为您的范围,然后只要在 AAD 中授予您想要的权限,它就可以工作。

标签: sharepoint azure-active-directory microsoft-teams sharepoint-rest-api


【解决方案1】:

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

具体来说,端点是不一样的。以下是我如何执行失眠的休息请求:

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

【讨论】:

  • 这听起来正是我正在寻找的答案。太感谢了。我去看看。
  • 附带说明一下,您检查过 PnPJs 库吗?这可能有助于在不处理管道的情况下调用 REST api
  • 是的,它是一个不错的库,我不仅使用了它,而且还为它做出了贡献。但这似乎与身份验证无关。
  • 不幸的是没有帮助。也许特定于我的(单点登录)场景。我已经拥有用户令牌,并希望将其换成另一个(访问令牌),以允许我访问 SharePoint 资源(有关详细信息,请查看说明中的链接)。端点 accounts.accesscontrol.windows.net 似乎对此毫无用处,因为它不交换令牌,而只是得到一个?
【解决方案2】:

感谢@JeremyKelley-Microsoft 的回答,只是在这里发布给其他人:

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

0。应用注册权限

1。从团队获取令牌

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

2。交易图币(代流量)

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>

【讨论】:

    【解决方案3】:

    在我看来,SharePoint api 可以通过 http 请求通过访问令牌访问。所以如果你已经实现了调用graph api的功能,我认为操作是类似的。首先,创建 azure ad 应用程序并创建客户端密码,然后根据需要调用的 api 添加应用程序,最后使用客户端凭据流或任何其他合适的流生成访问令牌。

    或者您提到的“不通过图形 API”是指我上面所说的?如果我在某个地方误解了,请指出,我认为最好告诉我们您要调用哪个 api。

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

    根据您在评论中提供的链接,我发现其中的api(例如GetSite:https://graph.microsoft.com/v1.0/sites/root)需要'graph->Sites.ReadWrite.All'的api权限(它们都是图表api),所以当你生成访问令牌时,你需要在范围内添加它,当然,你需要先在azure门户中添加api权限。然后就可以调用api了。

    【讨论】:

    • 您理解正确。我只是不断被拒绝访问。我认为用于调用图形 API 的令牌可能不适合直接调用 SharePoint REST API,这就是原因。通过“graph api”(有效)我​​的意思是:docs.microsoft.com/en-us/graph/api/resources/…
    • 评论更新 => 是的,这是正确的;您需要图形 API 的权限才能使用图形 API 与共享点站点进行通信。但似乎图形令牌仅对图形 api 有效,如果我尝试像在您的第一个屏幕截图中那样使用它,我会被拒绝访问,这是我的问题。所以描述中的问题是——如何直接调用sharepoint REST API,而不是通过图形API。我的意思是,在您的第二个示例中,您使用的是图形 API,而不是 sharepoint rest API。
    • 澄清一下 - 图形 API 的“共享点部分”非常有限,对于我的应用程序来说还不够。所以,理想情况下,我想访问普通的 REST api。 CSOM 和服务器端也可以,我基本上是在寻找一种将“团队”代币换成“sharepoint”代币的方法(我相信这不是“图形”代币。但也许我弄错了?)
    • 你提到过这个doc 吗?我想这就是你想要的。
    • 不,不是,但感谢您的努力。
    猜你喜欢
    • 2017-02-27
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2023-03-10
    • 2021-06-08
    相关资源
    最近更新 更多