Apache中的Laravel获取报头值


Laravel in Apache getting header value

我在Laravel BaseController中有以下代码。我想用一个带有令牌的Authorization头来保护我所有的api资源。

  public function __construct()
  {
    $this->beforeFilter('@getUserFromToken');
  }
  public function getUserFromToken($route, $request)
  {
    $accessToken = Request::header('Authorization');
    if(!empty($accessToken)){
      $this->currentUser = User::findByToken($accessToken);
    }else{
      return Request::header('Authorization'); //THE PROBLEM
      return Response::json(['error'=>'Not authorized. Access token needed in Header.Authorization'], 403);
    }
  }

这是我的。htaccess。

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    RewriteEngine On
    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

所以如果我有标记的问题行,Apache将完美地读取所有内容。我将得到我的回复,而不是得到403。然而,如果我没有那行,我会得到403错误与我的自定义错误消息。为什么?显然,我使用相同的代码$this->currentUser = User::findByToken($accessToken);,为什么通过留下标记行,我将能够得到标题?是否有一个重定向发生在场景后面,以某种方式设置Authorization头只有第二次?是否有一个设置,我错过了apache第一次拿起头?

更新:我想我的问题是:如果我只是return Response::json(['error'=>'Not authorized. Access token needed in Header.Authorization'], 403);,我总是得到这个错误json。我的$accessToken总是空的。为什么?

更多更新:看起来我不应该重用Authorization头?我试着:

$accessToken = Request::header('Custom-Token');
if(!empty($accessToken)){
  $this->currentUser = User::findByToken($accessToken);
}else{
  return Response::json(['error'=>'Not authorized. Access token needed in Header.Authorization'], 403);
}

这次我能得到真正的令牌。我的问题仍然存在,为什么我可以返回"神奇"的头,突然得到它在Laravel?

这个相关的问题没有回答它,但指出了我正确的方向:laravel 4:为什么Request::header()没有得到指定的标头?

还有一件事:如果我使用php artisan serve服务,Authorization头确实没有神奇的返回。

这是一个Laravel &Apache问题,这一行在公共/。Htaccess为我修复了它:

RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

修复是从https://github.com/dingo/api/issues/54

PHP中不能有两次返回:

return Request::header();
return Response::json();

所以在你的代码中,只有头文件会返回,而你的代码会退出。

我认为这将工作

return Response::json(['error'=>'Not authorized. Access token needed in Header.Authorization'], 403)->header('Authorization');

如果没有-这肯定会:

$response = Response::json(['error'=>'Not authorized. Access token needed in Header.Authorization'], 403);
$response->header('Authorization');
return $response;