从“团队”选项卡调用SharePoint REST API

从“团队”选项卡调用SharePoint REST API,sharepoint,azure-active-directory,microsoft-teams,sharepoint-rest-api,Sharepoint,Azure Active Directory,Microsoft Teams,Sharepoint Rest Api,我有一个团队选项卡应用程序,需要对团队的站点进行一些操作。 用户需要进行身份验证,所有操作都是代表用户执行的 调用graph API有些文档化,我在这里找到了一篇很好的文章,例如: 但是我想直接调用SharePoint REST API,而不是通过graph API,因为我想做一些graph API不支持的操作,比如创建页面 我怎样才能做到这一点 据我所知,我需要将从团队获得的令牌交换到另一个可用于调用SharePoint的令牌。(代表流动)。我将SharePoint的作用域添加到应用程序注册

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

调用graph API有些文档化,我在这里找到了一篇很好的文章,例如:

但是我想直接调用SharePoint REST API,而不是通过graph API,因为我想做一些graph API不支持的操作,比如创建页面

我怎样才能做到这一点

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

请注意,这与调用graph API无关。这是关于“普通”SharePoint REST API的。对于调用GraphAPI,它是有效的

更多详细信息和休息电话:

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

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

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

根据您在评论中提供的链接,我发现其中的api(例如GetSite:)需要“graph->Sites.ReadWrite.All”的api权限(它们都是graph api),因此当您生成访问令牌时,您需要将其添加到范围中,而对于courese,您需要首先在azure portal中添加api权限。然后你可以调用api


我不确定“代表流”和“仅应用”流是否重要,但从我的实验来看,为图形调用获取令牌与为SP rest调用获取令牌不同

具体来说,端点是不同的。下面是我如何从数据库执行rest请求:


我想关键是使用
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()=>
2.交易图形令牌(代表流量)
POSThttps://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
客户识别码:
客户机密:
授权类型:urn:ietf:params:oauth:grant-type:jwt-bearer
断言:
请求的\u令牌\u使用:代表,
作用域:https://{tenant}/AllSites.Read
=>返回
3.使用访问令牌访问sharepoint REST API(获取根站点)
获取https://{tenant}/\u api/web
标题:
授权:“持票人”+

您理解正确。我只是一直被拒绝访问。我认为用于调用graph API的令牌可能不适合直接调用SharePoint REST API,这就是原因。我所说的“GraphAPI”(有效)的意思是:对更新的评论=>yes,这是正确的;您需要graph API的权限才能使用graph API与sharepoint网站通信。但似乎graph token只对graph api有效,如果我尝试像在您的第一个屏幕截图中那样使用它,我会被拒绝访问,这就是我的问题。因此,描述中的问题是-如何直接调用sharepoint REST API,而不是通过图形API。我的意思是,在第二个示例中,您使用的是graph API,而不是sharepoint rest API。澄清一下,graph API的“sharepoint部分”非常有限,对于我的应用程序来说还不够。所以,理想情况下,我希望能够访问正常的RESTAPI。CSOM和服务器端也可以,我基本上是在寻找一种方法,用“团队”令牌交换“sharepoint”令牌(我相信这不是“图形”令牌。但可能我弄错了?)?我想这是您想要的。不,不是,但感谢您的努力。据我所知,使用仅应用程序身份验证调用sharepoint rest端点需要使用证书。不允许使用appsecret。我不想仅使用app调用SharePoint,我想代表用户调用它。基本上,用我从团队获得的用户令牌交换适合调用SharePoint REST API的令牌。许多文章都在解释如何为graph API实现这一点(如描述中的一篇),但我还没有找到任何解释SharePoint REST API的文章。而且这些代币似乎不兼容。或者我遗漏了什么?你是不是在清单中明确使用“”作为你的许可?如果是这样,您需要用目标租户域替换域。您可能还需要进入Azure门户,查看您的团队应用程序是否已获得批准的目标SharePoint权限。@JeremyKelley Microsoft感谢您的评论。是的,我用过那个。但它是一个团队应用程序,应该适用于任何客户域。。。我的意思是,我事先不知道客户的域是什么,所以我无法将其添加到应用程序注册?这可能需要团队的输入,他们更了解团队的应用程序流程。您也可以尝试将“https://“+domain+”/.default”作为您的作用域,然后只要在AAD中授予您想要的权限,它就可以工作。
microsoftTeams.authentication.getAuthToken() => <teams_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>
GET https://{tenant}/_api/web

headers: 
  authorization: "bearer " + <access_token>