Sharepoint API无头获取访问令牌

问题描述:

我正在编写一个必须调用Sharepoint-online API的集成。我的集成不是一个Web应用程序,必须在没有用户在场的情况下工作。Sharepoint API无头获取访问令牌

据我所知,我需要两个设置步骤: 1.用户必须登录到Azure并设置应用程序并获取客户端ID。 2.我必须使用客户端ID和用户名和密码来调用服务,然后我将获得访问令牌,刷新令牌和ID令牌

一旦两个设置步骤完成,我就可以使用访问令牌调用服务,但有时这会过期,我需要使用刷新令牌来获得一个新的。

第2步对我来说似乎很奇怪。为什么不存在用户可以登录并获取访问刷新和ID令牌的用户界面?有人建立了一个实用的网站,或者我误解了某些东西?

感谢 罗伯特

+0

我开始调查https://developer.microsoft.com/zh-cn/ us/graph /作为解决方案。 – Robert3452

推荐的OAuth流为服务和守护程序的应用程序客户机凭证流(在流,有没有刷新令牌参与;客户端ID和客户端密钥是用于获取最终到期的访问令牌,然后您需要使用相同的客户端ID和密码获取新的访问令牌)。在SharePoint Online中的情况下,你有这种情况下2种选择:

  • 的SharePoint Online + Azure的访问控制服务(ACS)的集成。细节here。简而言之,您可以在网站集级别创建服务主体(add in only policy) - 请按照链接的博客中的“创建AppPrincipal”部分进行操作。然后,您需要在应用程序清单中指定您的应用程序需要的特定权限。请参阅“给予应用程序主体权限”部分中的示例 - 同样,您应该先定义what permissions your app needs。然后,您可以使用该服务主要从控制台应用程序:

的Program.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(); 


     } 
    } 

的app.config

<?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您无法获得租户的全权限(即所有网站集)
+0

这看起来很有帮助。你指出的文章提到了一个叫做App Manifest的东西。我不写一个Sharepoint应用程序,而是写在我们的集成服务器上,所以清单位让我感到困惑。 – Robert3452

+0

我只是添加更多信息到我的文章,希望它有帮助。 – andresm53