所以先琐事一点..
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来保持身份验证.相反,它会将不相关数据的REWRITES cookie文件作为对NOT AUTHRORISED访问请求的响应从服务发送给我.
我的问题是:
为什么cURL不使用存储的会话信息来保持身份验证?
有没有办法用cURL和基于NTLM协议的网站维护这个会话?
提前致谢.
最佳答案 几个月前,我遇到了类似的问题.我试图连接到一个navision soap api. Navision使用ntlm身份验证.问题是curl本身不支持ntlm所以你必须自己做.
在这种情况下帮助了我很多的博客文章如下:
http://rabaix.net/en/articles/2008/03/13/using-soap-php-with-ntlm-authentication
**编辑
对不起,我误解了你的问题.
你的问题很简单.
只需通过此行接收请求的标头
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
然后,您可以从curl_exec函数的结果中获取Set-Cookie标头.
preg_match('/^Set-Cookie:\s*([^;]*)/mi', $ret, $match);
$cookie = parse_url($match[0]);
现在您可以将它存储在某个地方,并在2ten请求中使用它.