php $_SERVER['HTTP_AUTHORIZATION'] 不工作

问题描述 投票:0回答:2

我想在我的项目中使用 jwt 标头授权,但是当我使用 $_SERVER['HTTP_AUTHORIZATION'] 从标头获取令牌时,它不起作用。我已经修改了 .httaccess 文件,但仍然没有任何结果。

CGIPassAuth On
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
php apache jwt http-headers authorization
2个回答
3
投票

解决方案1:

经过一番研究,我发现在某些情况下,出于安全原因,Apache 可能不会将授权标头传递给 PHP。但是,可以通过在站点的 .htaccess 文件中创建重写规则以将授权标头放入环境变量中来解决此问题。

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

将上述内容添加到 .htaccess 文件后,

$_SERVER['HTTP_AUTHORIZATION']
键现在已填充为授权标头的值。

因此,

A

print_r($_SERVER)
确认确实没有该键的项目
$_SERVER['HTTP_AUTHORIZATION']
因此我得到了一个空值。

但是,该值可以通过

getallheaders()
函数获得。

$token = getallheaders()['Authorization']);

echo '<pre>';
print_r($token);

通过打印

getallheaders()
PHP 函数,您应该看到附加了“授权”密钥。

解决方案2:

各种 Apache 模块通常会出于“安全原因”而去除授权标头。它们都有不同的模糊设置,您可以调整以否决此行为,但您需要准确确定应该归咎于哪个模块。

您可以通过 env 将标头直接传递给 PHP 来解决此问题。所以,只需将此行放入

.htaccess
文件中:

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

在某些情况下,即使这样也不能直接工作,您还必须更改 PHP 代码以访问

$_SERVER['REDIRECT_HTTP_AUTHORIZATION']
而不是
$_SERVER['HTTP_AUTHORIZATION']


0
投票

感谢您的第二个解决方案! 通过使用“REDIRECT_HTTP_AUTHORIZATION”,现在它可以在我的本地计算机/测试环境(XAMPP 8.2、Windows)上运行。

要获取两个 SERVER 变量,我必须使用以下代码:

list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['REDIRECT_HTTP_AUTHORIZATION'], 6)));
© www.soinside.com 2019 - 2024. All rights reserved.