我想在我的项目中使用 jwt 标头授权,但是当我使用 $_SERVER['HTTP_AUTHORIZATION'] 从标头获取令牌时,它不起作用。我已经修改了 .httaccess 文件,但仍然没有任何结果。
CGIPassAuth On
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
解决方案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']
。
感谢您的第二个解决方案! 通过使用“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)));