I have the following piece of code in Laravel BaseController. I want to protect all my api resources with an Authorization header with a token.
  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);
    }
  }
Here is my .htaccess if that's relevant.
<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>
So if I have the marked problem line, Apache will read everything perfectly. And I will get my responses back and not getting the 403. However, if I don't have that line, I will get 403 error with my custom error message. WHY? Obviously I am using the same code $this->currentUser = User::findByToken($accessToken);, why by leaving the marked line I'll be able to get the header? Is there a redirect happening behind the scene that sets the Authorization header somehow only the second time? Is there a setting that I missed for apache to pick up the header the first time?
UPDATE:
I guess my question is: if I just return Response::json(['error'=>'Not authorized. Access token needed in Header.Authorization'], 403);, I will always get this error json. And my $accessToken will always be empty. Why?
MORE UPDATE:
Looks like I shouldn't reuse Authorization Header? I tried:
$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);
}
And this time I'm able to get the real token. My question still stands then, why can I return the "magical" header and suddenly get it in Laravel?
This related question didn't answer it, but pointed me to the right direction: laravel 4: why is Request::header() not getting the specified header?
One more thing: the Authorization header does work without the magic return if I serve use php artisan serve, which uses php dev server.
It is a Laravel & Apache problem, this line in public/.htaccess fixed it for me:
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
The fix is from https://github.com/dingo/api/issues/54
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With