繁体   English   中英

使用cURL的PHP​​ NTLM会话

[英]PHP NTLM session with cURL

所以先来一点琐事。

有一个用ASP.NET网站编写的网站,该网站使用NTLM协议对要登录的用户进行身份验证。通常情况下,用户可以键入网站URL,提供凭据,在网络浏览器中进行身份验证和维护会话,这完全可以。

我想做的是创建将充当机器人的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来保持对beeing的身份验证。 相反,它会将不相关数据的Cookie文件从服务发送给我,以响应未授权的访问请求。

我的问题是:为什么cURL不使用存储的会话信息来保持bee身份验证? 有什么方法可以使用基于cURL和NTLM协议的网站维护此会话?

提前致谢。

几个月前,我也遇到了类似的问题。 我试图与navision soap api建立连接。 Navision使用ntlm身份验证。 问题是curl不本地支持ntlm,因此您必须自己做。

在这种情况下,对我有很大帮助的博客文章如下:

http://rabaix.net/zh/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请求中使用它。

我有同样的问题,我使用curl_setopt($ch, CURLOPT_COOKIEFILE, ""); 代码行。 该字符串应完全为

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM