通过PHP进行HTTP身份验证 - PHP_AUTH_USER未设置?

9

我尝试通过http实现一个小的身份验证,并从网络上复制了这段代码来检查它是否能正常工作:

<?php
    if(!isset($_SERVER['PHP_AUTH_USER'])) {
        header('WWW-Authenticate: Basic realm="My Realm"');
        header('HTTP/1.0 401 Unauthorized');
        echo 'Text to send if user hits Cancel button';
        exit;
    } else {
        echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
        echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
    }
?>

然而,我的浏览器总是要求输入用户名和密码,但在我取消之前从未输出任何内容。因此,我认为$_SERVER['PHP_AUTH_USER']从未设置!可能的问题是什么?我正在运行Ubuntu 10.04 LTS服务器,使用Apache/2.0.63 (Unix) mod_ssl/2.0.63 OpenSSL/0.9.7d DAV/2 Server


@Jonny Keogh:Safari 5和Firefox 5,然而Andreas已经通过检查CGI/FCGI来解决了这个问题。 - Christian Ivicevic
3个回答

23

对于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)));

感谢您的回答。当我正在磨我的手腕切割刀时,这个问题终于得到了解决。 - Reasurria
2
看起来你不需要这一行代码:list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6))); - Shawn
@Shawn list($... 是用于请求客户端的。 - Azmeer
“.htaccess” 修复方法对我起了作用。请注意,我必须将它放在最后面,否则我的 CodeIgniter 安装将无法正常工作。 - cdsaenz

22
运行phpinfo()。如果“Server API”为CGI/FCGI,则可以基本上忘记使用PHP从HTTP身份验证中获取有意义的方式。

2
实际上,它可以使用FastCGI工作。请参见我的答案:https://dev59.com/ZOrzs4cB2Jgan1znOtOH#56715271 - Erin Geyer

0

启用PHP-FPM,它就会开始工作。

$valid_passwords = array ("test" => "test");
$valid_users = array_keys($valid_passwords);

$user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];

$validated = (in_array($user, $valid_users)) && ($pass == $valid_passwords[$user]);

if (!$validated) {
    header('WWW-Authenticate: Basic realm="Test"');
    header('HTTP/1.0 401 Unauthorized');
    die ("Not authorized");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接