Php 服务器端的CURL HTTP身份验证

Php 服务器端的CURL HTTP身份验证,php,zend-framework,http,curl,Php,Zend Framework,Http,Curl,我正在用Zend构建一个web服务,在向用户发送响应之前,我必须对用户进行身份验证。用户将使用curl向服务器页面发送请求,并以curl\u setopt($curl,CURLOPT\u USERPWD,'key:pass')的形式传递其凭证。 Iam使用Zend framework,因此服务器端页面表示为: 以下是用户请求的全部代码(client.php): 现在我想要的是,我必须能够在服务器端(在我的zend控制器中)检索用户名和密码,以便我能够从数据库验证用户凭据并相应地发送响应。那

我正在用Zend构建一个web服务,在向用户发送响应之前,我必须对用户进行身份验证。用户将使用curl向服务器页面发送请求,并以
curl\u setopt($curl,CURLOPT\u USERPWD,'key:pass')的形式传递其凭证。

Iam使用Zend framework,因此服务器端页面表示为:

以下是用户请求的全部代码(client.php):



现在我想要的是,我必须能够在服务器端(在我的zend控制器中)检索用户名和密码,以便我能够从数据库验证用户凭据并相应地发送响应。那么如何在另一个页面中进行身份验证呢?

您需要将
CURLOPT\u HTTPAUTH
设置为
CURLAUTH\u BASIC

这样,在目标脚本中,
PHP\u AUTH\u USER
PHP\u AUTH\u PW
(纯文本)将可用

调用脚本:

<?php
$ch = curl_init('https://localhost/target.php');
// ...
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_exec($ch);
?>

我建议通过HTTPS执行cURL请求,因为用户名和密码是纯文本传输的。

Zend Framework有一个现成的组件用于处理HTTP身份验证

查看以下示例:

如果您不想使用它,您仍然可以采用“老派”方式,如中所述


并手动检查
$\u服务器['PHP\u AUTH\u USER']
$\u服务器['PHP\u AUTH\u PW']

您可以将用户名和密码作为post字段发送

$post_data = $user.":".$pass
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);

您可以使用$\u POST

获取凭据。只有将目标文件指定为位于根目录中的.php,我才能获取这些值。但是我使用zend,目标文件是一个带有动作的控制器文件,该动作包含一个参数。我已经用更多信息编辑了这个问题。如果我不使用zend framework,我还可以在$\u服务器阵列中获取这些值,并指定我的curl url,例如:,它不是zend应用程序的一部分,只是一个文件夹层次结构。但是我该如何使用zend控制器和action呢?对不起,@dskanth。我不知道。Me和Zend Framework不是特别的朋友。更正:
$pass=$\u SERVER['PHP\u AUTH\u PW'],请参阅@mikiquex谢谢您指出这一点。我相应地更正了答案。但是,对于第二种情况,正如我在下面的评论中所说的,我没有在$\u服务器数组中获取这些变量。只有当目标页面是一个php文件(存在于根目录中)时,它们才会出现。@dskanth根据协商的身份验证,您可能有摘要身份验证。请参阅PHP手册中的第二个示例,并验证是否有
PHP\u AUTH\u DIGEST
setOh。。。是的,我有PHP_AUTH_摘要集,如何修改此示例以验证服务器端的凭据?@dskanth此示例已经满足了您的要求。我建议您阅读示例中使用的函数,或者使用Zend_Auth组件。我一直在使用CURLOPT_HTTPHEADER发送header中的参数,我可以在控制器中检索它们,如:$request->getHeader('param');
$user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];
$post_data = $user.":".$pass
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);