HTTP身份验证与PHP不兼容

3
我使用Laravel/Lumen Shield扩展进行Http身份验证,但是在我的本地机器上一切都很完美,但在我们的服务器上出现了问题。
问题是,当我提交正确的登录数据后,登录屏幕再次出现。我尝试了不同的登录数据、不同的浏览器,但登录屏幕一遍又一遍地出现。
我最后检查的是将我的.htaccess更改为:
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

但是我只得到了404错误...

如果我使用htaccess/htpasswd,Http身份验证过程可以正常工作,但我想用PHP来处理它,首先我想了解问题出在哪里。

为了限制问题,我尝试了使用以下代码进行PHP Http身份验证:

    <?php
$realm = 'Geschützter Bereich';

// Benutzer => Passwort
$benutzer = array('admin' => 'mypass', 'gast' => 'gast');

if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="' . $realm .
           '",qop="auth",nonce="' . uniqid() . '",opaque="' . md5($realm) .
           '"');

    die('Text, der gesendet wird, falls der Benutzer auf Abbrechen drückt');
}

// Analysieren der Variable PHP_AUTH_DIGEST
if (!($daten = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
    !isset($benutzer[$daten['username']]))
    die('Falsche Zugangsdaten!');

// Erzeugen einer gültigen Antwort
$A1 = md5($daten['username'] . ':' . $realm . ':' .
          $benutzer[$daten['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'] . ':' . $daten['uri']);
$gueltige_antwort = md5($A1 . ':' . $daten['nonce'] . ':' . $daten['nc'] .
                        ':' . $daten['cnonce'] . ':' . $daten['qop'] . ':' .
                        $A2);

if ($daten['response'] != $gueltige_antwort)
    die('Falsche Zugangsdaten!');

// OK, gültige Benutzername & Passwort
echo 'Sie sind angemeldet als: ' . $daten['username'];

// Funktion zum analysieren der HTTP-Auth-Header
function http_digest_parse($txt) {
    // gegen fehlende Daten schützen
    $noetige_teile = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1,
                           'username'=>1, 'uri'=>1, 'response'=>1);
    $daten = array();
    $schluessel = implode('|', array_keys($noetige_teile));

    preg_match_all('@(' . $schluessel . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@',
                   $txt, $treffer, PREG_SET_ORDER);

    foreach ($treffer as $t) {
        $daten[$t[1]] = $t[3] ? $t[3] : $t[4];
        unset($noetige_teile[$t[1]]);
    }

    return $noetige_teile ? false : $daten;
}
?>

同样的情况,这段代码在我的本地机器上可以工作,但是问题仍然存在于我的服务器上。

关于环境的一些信息...

本地:Debian with PHP 5.6 服务器:Gentoo with PHP 5.6

我使用的是 Lumen 5.1 项目,而不是 Laravel。

谢谢你的帮助 :)

2个回答

7
问题已经解决。
我在我们的服务器上检查了phpinfo(),发现SERVER API是CGI/FastCGI。
参考HTTP Auth via PHP - PHP_AUTH_USER not set?,运行phpinfo()。如果“Server API”是CGI/FCGI,你几乎可以忘记它,因为从PHP使用HTTP身份验证没有明智的方法。
现在我知道问题出在哪里,并且在我的public/.htacces中添加以下部分来解决这个问题。
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

5

我有过类似的问题。我之前使用的是PHP 7.2 CGI,然后我切换到了FastCGI,问题就解决了。

解决方案:

1)切换到PHP FastCGI(而不是PHP CGI)

2)确保在你的 .htaccess 文件中有所需的行:

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

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