所以先说一点琐事..
有一个用 ASP.NET 编写的网站,它使用 NTLM 协议对想要登录的用户进行身份验证。他们通常使用它时完全可以,他们输入网站 URL,他们提供他们的凭据,在 Web 浏览器中进行身份验证和维护会话。
我想做的是创建将充当机器人的 PHP 网站。这是我公司的内部网站,我被批准这样做。我遇到的问题是管理会话。用户将能够在我的 PHP 网站中输入他们的凭据,我的 PHP 网站将使用 cURL 对目标站点进行身份验证。
到目前为止我得到的代码是:
$cookie_file_path = dirname(__FILE__) . '/cookies.txt';
$ch = curl_init();
//==============================================================
curl_setopt($ch, CURLOPT_USERPWD, $username. ':' . $password);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_FAILONERROR, 0);
curl_setopt($ch, CURLOPT_MAXREDIRS, 100);
//=============================================================
$ret = curl_exec($ch);
上面的代码通过 cURL 登录到目标网站(它似乎管理 NTLM 握手),并获取网站内容。它还存储在 cookie 文件中发回的会话 ID。
我接下来要做的是评论该CURLOPT_USERPWD
选项,希望此脚本将使用存储在 cookie 文件中的会话 ID 在此脚本的第二次执行中验证先前登录的用户。它可以摆脱用户凭据并且不以这种方式将其存储在任何地方,因为将其存储在手动创建的会话、数据库或其他任何地方都不安全。
我需要这个,因为机器人将使用 CRON 定期检查网站状态是否已更改并执行一些用户操作作为对此的反应。但是要做到这一点,首先必须对用户进行身份验证,并且他的用户名和密码不能存储在任何地方,所以我必须使用他最初登录时建立的会话信息。
CURL 似乎不这样做。当我使用注释选项第二次执行脚本时CURLOPT_USERPWD
,它不使用存储的 cookie 来保持身份验证。相反,它会重写cookie 文件,其中包含从服务发送给我的不相关数据,作为对未授权访问请求的响应。
我的问题是:为什么 cURL 不使用存储的会话信息来保持身份验证?有什么方法可以使用基于 cURL 和 NTLM 协议的网站来维护这个会话?
提前致谢。