引言
基于
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。
来源:http://blog.qiji.tech/archives/16054