授权 header 未到达 laravel 项目中的服务器
Authorization header not reaching the server in laravel project
我正在使用 JWT 令牌授权 android 用户,但是当我发送它时它到达 null,服务器是否删除授权 header?是否需要更改配置以允许我的 header 传递到后端?
按照第二种解法。
我在 cPanel 托管中遇到过这个问题,一些安全 mod 或插件从 header 中删除了授权数据,我使用的是 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);
}
}
顺便说一句,编辑核心代码并不理想。
只是为 Google 员工更新,因为我也在寻找解决方案,觉得修改核心代码不是一个好主意!
我得到的解决方案是使用中间件。在我的 JavaScript 中,我设置 X-Authorization
headers 而不是 Authorization
.
然后我创建了一个 HTTP 中间件 class 来获取这个 header 并设置我们的授权 header -
<?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
header,就好像当您将它作为 X-Authorization
header 传递时它确实存在一样。
在public/.htaccess:
中添加授权处理代码
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
参考:https://github.com/laravel/laravel/blob/master/public/.htaccess
我正在使用 JWT 令牌授权 android 用户,但是当我发送它时它到达 null,服务器是否删除授权 header?是否需要更改配置以允许我的 header 传递到后端?
按照第二种解法。
我在 cPanel 托管中遇到过这个问题,一些安全 mod 或插件从 header 中删除了授权数据,我使用的是 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);
}
}
顺便说一句,编辑核心代码并不理想。
只是为 Google 员工更新,因为我也在寻找解决方案,觉得修改核心代码不是一个好主意!
我得到的解决方案是使用中间件。在我的 JavaScript 中,我设置 X-Authorization
headers 而不是 Authorization
.
然后我创建了一个 HTTP 中间件 class 来获取这个 header 并设置我们的授权 header -
<?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
header,就好像当您将它作为 X-Authorization
header 传递时它确实存在一样。
在public/.htaccess:
中添加授权处理代码
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
参考:https://github.com/laravel/laravel/blob/master/public/.htaccess