Http Auth 不适用于 PHP
Http Auth dosen't work with PHP
我使用 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 . ')=(?:([\'"])([^]+?)|([^\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 PHP 5.6
服务器:Gentoo PHP 5.6
对于项目,我使用了 Lumen 5.1 而不是 Laravel。
谢谢你帮助我:)
问题已解决
我检查了我们服务器上的 phpinfo() 并且服务器 API 在 CGI/FastCGI 上。
Run phpinfo(). if "Server API" is CGI/FCGI, you can pretty much forget
it as there is no sensible way to use HTTP auth from PHP.
现在我知道问题出在哪里了,我在将以下部分添加到我的 public/.htacces 中时解决了问题。
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=[=10=]
我遇到了类似的问题。我使用的是 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>
我使用 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 . ')=(?:([\'"])([^]+?)|([^\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 PHP 5.6 服务器:Gentoo PHP 5.6
对于项目,我使用了 Lumen 5.1 而不是 Laravel。
谢谢你帮助我:)
问题已解决
我检查了我们服务器上的 phpinfo() 并且服务器 API 在 CGI/FastCGI 上。
Run phpinfo(). if "Server API" is CGI/FCGI, you can pretty much forget it as there is no sensible way to use HTTP auth from PHP.
现在我知道问题出在哪里了,我在将以下部分添加到我的 public/.htacces 中时解决了问题。
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=[=10=]
我遇到了类似的问题。我使用的是 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>