为什么没有设置$ _SERVER [“PHP_AUTH_USER”]和$ _SERVER [“PHP_AUTH_PW”]?

时间:2013-02-06 07:57:43

标签: php web-services authentication basic-authentication

在开始之前,我想指出我已经浏览了Stack Overflow并发现了其他类似的问题 - PHP_AUTH_USER not set?HTTP Auth via PHP - PHP_AUTH_USER not set? - 这些都指出了身份验证$ _SERVER变量如果''Server API''设置为''CGI / FCGI'',则不会设置,但我检查了''phpinfo()''输出,我的''Server API''设置为''Apache 2.0处理程序 ''。

好的,我有一个简单的脚本如下:

<?php
    echo "Username: " . $_SERVER["PHP_AUTH_USER"] . ", Password: " . $_SERVER["PHP_AUTH_PW"];
?>

...我通过以下方式远程呼叫:

wget -v --http-user=johnsmith --http-password=mypassword http://www.example.com/myscript.php

...但只输出:

Username: , Password:

我还尝试使用PHP cURL调用脚本并正确设置身份验证参数,如下所示:

 curl_setopt($ch, CURLOPT_USERPWD, "johnsmith:mypassword");

...但我得到与上面相同的输出。

知道我做错了什么吗?也许我需要启用/配置其他东西?

4 个答案:

答案 0 :(得分:12)

对于PHP-CGI:

在.htaccess中添加:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
</IfModule>

并在脚本开头添加:

list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));

答案 1 :(得分:5)

我终于在irc.freenode.net的## php中借助Naktibalda的帮助找到了答案

以下页面总结了问题:http://php.net/manual/en/features.http-auth.php

引用相关位:

  

从PHP 4.3.0开始,为了防止某人编写显示通过传统外部机制验证的页面密码的脚本,如果为该特定用户启用了外部身份验证,则不会设置PHP_AUTH变量页面和安全模式已启用。无论如何,REMOTE_USER可用于识别外部认证用户。所以,你可以使用$ _SERVER ['REMOTE_USER']。

     

...

     

PHP使用AuthType指令的存在来确定外部身份验证是否有效。

答案 2 :(得分:1)

尝试了以前的建议,没有用,也发现了

CGIPassAuth On 

是建议的htaccess的最新版本,但对我仍然无效,相反,我使用了

SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

(必须在您的htaccess根文件中),然后在php文件中

list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['REDIRECT_HTTP_AUTHORIZATION'], 6)));

如果仍然有人遇到问题,我建议他们检查服务器变量,因为数据可能位于不同的变量中,所以您寻找的是从基本开始的

答案 3 :(得分:-4)

这应该是这样的

echo "Username: " . $_SERVER[PHP_AUTH_USER] . ", Password: " . $_SERVER[PHP_AUTH_PW];