【问题标题】:Sharepoint API Headless Obtaining Access TokensSharepoint API Headless 获取访问令牌
【发布时间】:2017-11-02 07:10:43
【问题描述】:

我正在编写一个必须调用 Sharepoint-online API 的集成。我的集成不是 web 应用程序,必须在没有用户在场的情况下工作。

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

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

第 2 步对我来说似乎很奇怪。为什么没有用户可以登录并获取访问刷新和 ID 令牌的用户界面?是否有人建立了一个实用程序网站来执行此操作,还是我误解了什么?

谢谢 罗伯特

【问题讨论】:

标签: azure sharepoint oauth sharepoint-online


【解决方案1】:

服务和守护程序应用程序的推荐 OAuth 流程是客户端凭据流程(在该流程中,不涉及刷新令牌;a客户端 ID 和客户端密码用于获取最终过期的访问令牌,然后您需要使用相同的客户端 ID 和密码获取新的访问令牌)。对于 SharePoint Online对于这种情况,您有 2 个选项:

  • SharePoint Online + Azure 访问控制服务 (ACS) 集成。 详细信息 here。简而言之,您可以在网站集级别创建一个服务主体 (add in only policy) - 请按照我为此链接的博客中的“创建 AppPrincipal”部分进行操作。然后,您需要在应用程序清单中分配您的应用程序所需的特定权限。请参阅“授予应用程序主体权限”部分中的示例 - 同样,您应该首先定义 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();


        }
    }

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,您不能让该应用拥有租户范围的权限(即所有网站集)

【讨论】:

  • 这看起来可能会有所帮助。你指出的文章提到了一个叫做 App Manifest 的东西。我不是在编写 Sharepoint 应用程序,而是我正在编写的内容将在我们的集成服务器上运行,因此清单位让我感到困惑。
  • 我刚刚在我的帖子中添加了更多信息,希望对您有所帮助。
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
相关资源
最近更新 更多