Http Auth 不适用于 PHP

Posted

技术标签:

【中文标题】Http Auth 不适用于 PHP【英文标题】:Http Auth dosen't work with PHP 【发布时间】:2016-11-06 10:22:06 【问题描述】:

我使用 Laravel/Lumen Shield Extension 进行 Http 身份验证,但是在我的本地机器上一切都很完美,我的服务器上只有问题。

问题是在我提交正确的登录数据后,登录屏幕再次出现。我尝试了不同的登录数据,不同的浏览器,登录屏幕一次又一次地出现。

我检查的最后一件事是将我的 .htaccess 更改为:

RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization,L]

但我只有一个 404 ...

如果我使用 htaccess/htpasswd,Http Auth 过程可以工作,但我想用 php 处理这个问题,首先我想了解问题出在哪里。

为了限制问题,我尝试了使用此代码的 PHP Http Auth:

    <?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;

?>

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

关于环境的一些信息..

本地:使用 PHP 5.6 的 Debian 服务器:使用 PHP 5.6 的 Gentoo

对于这个项目,我使用 Lumen 5.1 而不是 Laravel。

谢谢你帮助我:)

【问题讨论】:

【参考方案1】:

问题解决了。

我检查了我们服务器上的 phpinfo() 并且 SERVER API 在 CGI/FastCGI 上。

HTTP Auth via PHP - PHP_AUTH_USER not set?

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

现在我知道问题出在哪里,我解决了这个问题,同时将以下部分添加到我的 public/.htacces 中。

SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

【讨论】:

【参考方案2】:

我遇到了类似的问题。我使用的是 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>

【讨论】:

以上是关于Http Auth 不适用于 PHP的主要内容,如果未能解决你的问题,请参考以下文章

Flutter [local_auth] 不适用于 Android <28

Laravel 8 门不适用于 Auth::guard

Basic Auth不适用于多个配置

GraphQL graph.cool 用户查询不适用于 Auth0 令牌

JWT Auth 令牌适用于 Homestead,但不适用于生产服务器

Azure 移动服务 LoginAsync 方法不适用于 Microsoft Auth Token