2012-02-02 82 views
3

我有一个动态的PHP页面,我需要调用一个get参数。然后我想把生成的html放入一个字符串中并稍后使用它(我正在为Web服务试用Tonic框架)php:转发ntlm凭据卷曲

所以这与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; 
    //... 
} 

回答

1

答案很简单:

这是不可能的。

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

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

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

编辑:

我基本上减少了NTLM的使用甚至更多。我现在有1个登录页面(认证),其他一切都由php会话(授权)控制。见

Apache2, PHP: create automatic ntlm login page

3

我能得到这个通过添加下列卷曲选项工作:

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

+0

很久以前。请记住,我只是没有明确地设置userpwd而无法正常工作。但是玛比我只是做了一些错误的事情。无论如何,现在我只有1页(登录页面)在NTLM控制下。由PHP会话休息。请参阅上面的编辑链接。就我个人而言,我认为这是一种更好的方法,因为改变认证机制很容易。 – 2013-03-21 16:31:14