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

Posted

技术标签:

【中文标题】通过 PHP 进行 HTTP 身份验证 - 未设置 PHP_AUTH_USER?【英文标题】:HTTP Auth via PHP - PHP_AUTH_USER not set? 【发布时间】:2011-10-26 13:37:48 【问题描述】:

我尝试通过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'] 永远不会设置!可能是什么问题?我正在使用Apache/2.0.63 (Unix) mod_ssl/2.0.63 OpenSSL/0.9.7d DAV/2 Server 运行 Ubuntu 10.04 LTS 服务器。

【问题讨论】:

@Jonny Keogh:Safari 5 和 Firefox 5,但是 andreas 已经通过检查 CGI/FCGI 解决了这个问题。 【参考方案1】:

运行 phpinfo()。如果“服务器 API”是 CGI/FCGI,你几乎可以忘记它,因为没有明智的方法来使用 PHP 的 HTTP 身份验证。

【讨论】:

这就是问题所在!谢谢 - 帮助了我。 实际上,它适用于 FastCGI。在这里查看我的答案:***.com/a/56715271/1772821【参考方案2】:

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

【讨论】:

赞美主的回答。当这终于解决了我的问题时,我正在磨我的割腕刀。 看起来你不需要这行:list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6))); @Shawn list($... 用于请求的客户端。 .htaccess 修复对我有用。请注意,我必须将其放在末尾,否则我的 codeigniter 安装将无法正常工作【参考方案3】:

启用 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");

【讨论】:

以上是关于通过 PHP 进行 HTTP 身份验证 - 未设置 PHP_AUTH_USER?的主要内容,如果未能解决你的问题,请参考以下文章

PHP:使用 HTTP Digest Authentication 响应向 LDAP 进行身份验证

在 PHP 中访问 HTTP 身份验证用户名?

如何在 PHP 中使用基本 HTTP 身份验证?

HTTP 客户端未向代理服务器 C# 进行身份验证

身份验证用户提供程序 [passport] 未使用 laravel 护照定义

Lumen 中的中间件身份验证 [未找到“身份验证”类]