4

所以先说一点琐事..

有一个用 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 协议的网站来维护这个会话?

提前致谢。

4

2 回答 2

1

几个月前,我遇到了和你类似的问题。我试图连接到 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 请求中使用它。

于 2013-02-27T12:07:55.727 回答
1

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

于 2016-07-05T06:53:27.943 回答