引言

基于
Laravel Framework version Lumen (5.2.9)
的项目中的 tymon/jwt-auth 验证不生效,检查过后发现是 Apache 抛弃了 Authorization 的 HTTP Header 头导致的,如果把 $_SERVER 打印出来会发现根本没有 HTTP_AUTHORIZATION。
我的服务器环境是 php 5.6.29 Apache/2.4.23

名词解释

Json web token (JWT),是基于 JSON 开放标准 RFC7519,常用于用户认证等。
tymon/jwt-auth 是基于 laravel 和 lumen 开发的 jwt 验证拓展包。

解决办法一 官方方案 URL Rewrite

找到这个 tymon/jwt-auth 的 github 库,在其 wiki 页找到官方给出的解决办法

这个方法需要开启 Apache 的 rewrite 模块,找到 httpd.conf 中的这一行,去掉注释打开模块

之后把上面的代码添加对应的 IfModule 代码块里。再重启 Apache服务或者重新加载配置

关于 Apache rewrite 的更多语法网上有许多文章,这里就不展开了。

解决办法二 setenvif

由于第一个方法在我这里没奏效,所以另寻他径。找到了用 setenvif 的解决办法。

命令 setEnvIf 的第一个参数是 HTTP 请求头域(参见 RFC2616),第二个参数是 regex Perl兼容的正则表达式, 最后是要设置的变量,该语句中匹配整个 Authorization 域并将这个模式直接赋值给环境变量 HTTP_AUTHORIZATION。

setEnvIf 更多详细用法参见 mod_setenvif

要使这个语句正确生效同样要开启对应的模块并添加到 IfModule 模块

之后同样重启 Apache 使之生效。

生效后在任意php文件打印 $_SERVER 或者输出 $_SERVER[‘HTTP_AUTHORIZATION’] 都能看到 php 正确接收到 authorization 头了。

分布式配置

tymon 的 wiki 中提到 Apache 是抛弃了非 base64 加密的 Authorization ,一说这是某些模块为了保护服务器而做的。如果你要保护你的整个服务器而仅为某个项目开启 authorization 功能,可以把 IfModule 部分的代码写到 .htaccess 文件里。

在 httpd.conf 中查找

改为

把写好的 .htaccess 文件放在项目入口文件同一目录下即可。
最后测试一下是否生效,不生效则重启 Apache。

发表评论

电子邮件地址不会被公开。 必填项已用*标注