我尝试通过 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/
我收到的错误是:
外部共享已禁用
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
我目前正在尝试但没有成功的是重现在共享点站点本身完成的身份验证:
https://login.microsoftonline.com/extSTS.srf
进行身份验证(成功)https://sharepointSite.sharepoint.com/{token}/login
(失败,缺少cookie)https://sharepointSite.sharepoint.com/_forms/default.aspx
(尚未达到)我正在添加 cookie,但后端似乎发生了其他情况或缺少某些 cookie。
如果有人提供任何帮助,我将不胜感激。与此同时,我将继续努力。
PS:我已经搜索了 SO 上的大部分答案,但它们要么引用了不同版本的 Sharepoint 和库,要么已经过时(尝试过,但没有成功)。
编辑: 最终不需要第 2 步。
看来问题出在图书馆本身。我通过添加字符串解决了这个问题
“&来源=/sites/SubSiteName/”
到网址。该行本身变成:
//$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