我正在编写一个必须调用 Sharepoint-online API 的集成。我的集成不是网络应用程序,必须在没有用户在场的情况下工作。
据我了解,我需要两个设置步骤: 1. 用户必须登录Azure并设置应用程序并获取客户端ID。 2. 我必须使用客户端 ID 以及用户名和密码调用服务,然后我将获得访问 token 、刷新 token 和 ID token
完成两个设置步骤后,我就可以使用访问 token 调用服务,但有时访问 token 会过期,我需要使用刷新 token 来获取新的 token 。
第 2 步对我来说似乎很奇怪。为什么没有一个用户界面可供用户登录并获取访问刷新和 ID token ?有人建立了一个实用程序网站就是这样做的,还是我误解了某些东西?
谢谢 罗伯特
最佳答案
针对服务和守护程序应用推荐的 OAuth 流程是客户端凭据流程(在该流程中,不涉及刷新 token ;客户端 ID 和客户端 key 用于获取访问 token ,该 token 最终会过期,然后您需要使用相同的客户端 ID 和 key 获取新的访问 token )。对于 SharePoint Online,对于这种情况,您有 2 个选项:
- SharePoint Online + Azure 访问控制服务 (ACS) 集成。 详细信息 here 。简而言之,您可以在网站集级别创建一个服务主体 ( add in only policy ) - 按照我为此链接的博客中的“创建 AppPrincipal”部分进行操作。然后,您需要在应用程序 list 中分配您的应用程序所需的特定权限。请参阅“授予应用程序主体权限”部分中的示例 - 同样,您应该首先定义 what permissions your app needs 。然后,您可以从控制台应用程序使用服务主体:
程序.cs
static void Main(string[] args)
{
Uri siteUri = new Uri("https://tenant.sharepoint.com/teams/test");
//Get the realm for the URL
string realm = TokenHelper.GetRealmFromTargetUrl(siteUri);
//Get the access token for the URL.
// Requires this app to be registered with the tenant
string accessToken = TokenHelper.GetAppOnlyAccessToken(
TokenHelper.SharePointPrincipal,
siteUri.Authority, realm).AccessToken;
HttpWebRequest endpointRequest =
(HttpWebRequest)HttpWebRequest.Create(
"https://tenant.sharepoint.com/teams/test/_api/web/lists/GetByTitle('Documents')/items");
endpointRequest.Method = "GET";
endpointRequest.Accept = "application/json;odata=verbose";
endpointRequest.Headers.Add("Authorization", "Bearer " + accessToken);
HttpWebResponse endpointResponse =
(HttpWebResponse)endpointRequest.GetResponse();
}
}
应用程序配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<appSettings>
<add key="ClientId" value="65e674ca-3827-4134-852b-1196ff935e08"/>
<add key="ClientSecret" value="xxxxxxx"/>
</appSettings>
</configuration>
- SharePoint Online + Azure Active Directory (AAD) 集成。 详细信息 here 。在该链接中,您将找到示例代码。第一种方法的区别在于,您使用的不是 ACS,而是 AAD。应用程序所需的权限是在 AAD 中定义的 - 截至目前,据我所知,您可以在 AAD 中定义的应用程序权限不如通过 ACS 定义的那么细化 -即,使用 ACS,您可以在网站集级别定义应用程序,而使用 AAD,则不能,该应用程序将具有租户范围的权限(即所有网站集)
关于azure - Sharepoint API Headless 获取访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44302399/