我在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;