【问题标题】:php: forward ntlm credentials to curlphp:将 ntlm 凭据转发到 curl
【发布时间】:2012-02-02 11:40:42
【问题描述】:

我有一个动态 php 页面,我需要使用 get 参数调用它。然后我想将生成的 html 放入一个字符串中并稍后使用它(我正在尝试为 Web 服务提供 tonic 框架)

所以这类似于PHP - Read dynamically generated (and echoed) HTML into a string?,我尝试了使用 cURL 的答案。

问题是身份验证是使用 ntlm (apache mod_auth_sspi) 完成的。执行 curl 的 php 脚本已经过身份验证,例如只有有效用户才能执行它。以某种方式可以将这些“凭据”传递给 cURL? (用户名可用,但当然不是密码)

或者完全不同的方法也可以,但我唯一的想法是创建一个函数来创建带有 html 内容的字符串。

$response = new Response($request);
$format = $request->mostAcceptable(array(
    'json', 'html', 'txt'
        ));

switch ($format) {

    case 'html':
        $response->addHeader('Content-type', 'text/html');
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'http://localhost/viewRecord.php?identifier=' . $identifier);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM); 
        $html = curl_exec($ch);
        curl_close($ch);
        $response->body = $html;
        break;
    //...   
}

【问题讨论】:

    标签: php curl ntlm


    【解决方案1】:

    我可以通过添加以下 curl 选项来实现它:

    curl_setopt($curly[$id], CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
    curl_setopt($curly[$id], CURLOPT_UNRESTRICTED_AUTH, true);
    curl_setopt($curly[$id], CURLOPT_USERPWD, ":");
    

    根据 php 的版本,有一个错误打开:https://bugs.php.net/bug.php?id=62195

    【讨论】:

    • 很久以前。请记住,如果没有明确设置 userpwd,我只是没有让它工作。但也许我只是做错了什么。无论如何,现在我在 NTLM 控制下只有 1 个页面(登录页面)。通过 php 会话休息。请参阅上面编辑中的链接。就我个人而言,无论如何我认为这会更好,因为这样很容易更改身份验证机制。
    • 这对我不起作用。参考我的回答:stackoverflow.com/questions/9111705/…
    【解决方案2】:

    这对我有用:

    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM|CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, true);
    curl_setopt($ch, CURLOPT_USERPWD, "YOUR_USER:YOUR_PWD");
    

    【讨论】:

      【解决方案3】:

      答案很简单:

      这是不可能的。

      解决方法是将所有文件(包括 php、JavaScript 和 CSS)放在不需要 NTLM 身份验证的目录中。

      要实现这一点,要么需要访问 Apache 配置,如果这不可能,您唯一可以希望的是 Apache 配置允许覆盖 .htaccess 中的 SSPI。允许任何身份验证(=也没有)但限制对 127.0.0.0 的访问,因为所有请求都来自同一服务器上的 cURL。

      对于授权,您可以将数据放入 php session 并将 session cookie 传递给 cURL,然后 session 数据可以用于从 cURL 调用的页面中的授权。

      编辑:

      我基本上进一步减少了 NTLM 的使用。我现在有 1 个登录页面(身份验证),其他一切都由 php 会话(授权)控制。见

      Apache2, PHP: create automatic ntlm login page

      【讨论】:

        猜你喜欢
        • 2013-08-03
        • 1970-01-01
        • 1970-01-01
        • 2019-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多