授权标头未到达 laravel 项目中的服务器
Posted
技术标签:
【中文标题】授权标头未到达 laravel 项目中的服务器【英文标题】:Authorization header not reaching the server in laravel project 【发布时间】:2018-09-12 14:04:27 【问题描述】:我正在使用 JWT 令牌来授权 android 用户,但是当我将它发送为 null 时,服务器是否删除了 Authorization 标头?是否需要更改配置以允许我的标头传递到后端?
【问题讨论】:
如何发送标头? 【参考方案1】:只是为谷歌人更新,因为我也在寻找解决方案,觉得修改核心代码不是一个好主意!
我的解决方案是使用中间件。在我的 javascript 中,我设置了 X-Authorization
标头而不是 Authorization
。
然后我创建了一个 HTTP 中间件类来获取这个标头并设置我们的授权标头 -
<?php
namespace App\Http\Middleware;
use Closure;
class XAuthorizationHeader
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
// check if we have an X-Authorization header present
if($auth = $request->header('X-Authorization'))
$request->headers->set('Authorization', $auth);
return $next($request);
然后在App\Http\Kernel.php
$middleware
数组中,一开始就添加这个中间件。
protected $middleware = [
XAuthorizationHeader::class,
然后,任何进一步的代码都可以检索 Authorization
标头,就像当您将它作为 X-Authorization
标头传递时它实际存在一样。
【讨论】:
@theinquisitor 这应该是公认的答案,无论如何编辑框架都不应该是答案。 除了用户标记之外,还有什么方法可以改变接受的答案?我同意不应该向搜索此解决方案的人提供有关修改核心代码的内容! 不知道,我只是标记答案以引起任何版主的注意。 在 laravel 8 上仍然存在同样的问题【参考方案2】:在public/.htaccess中添加授权处理代码:
# Handle Authorization Header
RewriteCond %HTTP:Authorization .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]
参考:https://github.com/laravel/laravel/blob/master/public/.htaccess
【讨论】:
【参考方案3】:遵循第二个解决方案。
我在 cPanel 托管中遇到了这个问题,一些安全模块或插件从标题中删除了授权数据,我使用的是 Authorization Bearer
。我通过重命名 Authorization
-> ApiToken
并在 Laravel 核心中更新几行代码来绕过它。
文件vendor\laravel\framework\src\Illuminate\Http\Concerns\InteractsWithInput.php
方法bearerToken
。
public function bearerToken()
$header = $this->header('Authorization', $this->header('ApiToken', ''));
if (Str::startsWith($header, 'Bearer '))
return Str::substr($header, 7);
顺便说一句,编辑核心代码并不理想。
【讨论】:
以上是关于授权标头未到达 laravel 项目中的服务器的主要内容,如果未能解决你的问题,请参考以下文章
RestSharp - 授权标头未涉及 WCF REST 服务