无法使用 PHP 在子站点上的 Sharepoint API 中进行身份验证

Unable to authenticate in Sharepoint API on subsite using PHP

我正在尝试通过 PHP 在 SharePoint 子站点上进行身份验证,以便使用 REST API,但我遇到了一些奇怪的行为。

我正在使用 vgrem 库。

这是我使用的代码:

$authCtx = new AuthenticationContext($Settings['Url']);
$authCtx->acquireTokenForUser($Settings['UserName'],$Settings['Password']);

$ctx = new ClientContext($Settings['Url'],$authCtx);

url 的格式如下:

https://sharepointSite.sharepoint.com/sites/SubSiteName/

我得到的错误是:

External sharing is disabled for https://sharepointSite.sharepoint.com/

从外观上看,SharePoint 网站本身并未对外共享,但子网站是。

我可以通过浏览器进行身份验证并执行一些简单的 GET 查询。

库本身会自动尝试在以下位置进行身份验证:

https://sharepointSite.sharepoint.com/_forms/default.aspx?wa=wsignin1.0

我还尝试更改库本身以找到子站点授权页面,但没有成功。我尝试过的一些例子:

https://sharepointSite.sharepoint.com/sites/SubSiteName/_forms/default.aspx?wa=wsignin1.0

https://sharepointSite.sharepoint.com/sites/_forms/default.aspx?wa=wsignin1.0

我目前正在尝试但没有成功的是重现在共享点站点本身完成的身份验证:

  1. https://login.microsoftonline.com/extSTS.srf 进行身份验证(成功)
  2. 页面被重定向到 https://sharepointSite.sharepoint.com/{token}/login(失败,缺少 cookie) 事实证明,身份验证过程不需要此步骤。
  3. https://sharepointSite.sharepoint.com/_forms/default.aspx(尚未达到)

我正在添加 cookie,但后端似乎发生了其他事情,或者某些 cookie 丢失了。

如果有人提供任何帮助,我将不胜感激。与此同时,我会继续努力。

PS: 我已经搜索了关于 SO 的大部分答案,但它们要么引用了不同版本的 Sharepoint 和库,要么已经过时(尝试过,但没有成功)。

编辑:最后不需要第 2 步。

看来问题出在图书馆本身。我通过添加字符串

解决了这个问题

"&Source=/sites/SubSiteName/"

到url。该行本身变为:

//$subsite = "&Source=https://sharepointSite.sharepoint.com/sites/SubSiteName/"
$response = Requests::post($url.$subsite,null,$token, true, false);

函数内部 acquireAuthenticationCookies($token)。额外的 false 是添加的新变量,以便仅在相关请求上应用 curl 选项。

此外,我不得不稍微修改 cookie 设置,因为库会在重定向时自动丢弃它们。我必须在请求中添加以下设置:

curl_setopt($ch, CURLOPT_COOKIESESSION, false);
curl_setopt($ch, CURLOPT_COOKIEFILE, "");

编辑:忘了放我编辑的文件。它作为

php-spo/src/Runtime/Auth/SamlTokenProvider.php