【问题标题】:Laravel in Apache getting header valueApache中的Laravel获取标头值
【发布时间】:2014-07-27 23:45:42
【问题描述】:

我在 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-&gt;currentUser = User::findByToken($accessToken);,为什么离开标记的行我就能得到标题?幕后是否发生了重定向,以某种方式仅第二次设置 Authorization 标头?有没有我错过的设置让 apache 第一次拿起标头?

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

更多更新: 看起来我不应该重用Authorization Header?我试过了:

$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: why is Request::header() not getting the specified header?

还有一件事:如果我使用 php artisan serve(它使用 php 开发服务器),Authorization 标头确实可以在没有神奇返回的情况下工作。

【问题讨论】:

    标签: php apache laravel


    【解决方案1】:

    这是 Laravel 和 Apache 的问题,public/.htaccess 中的这一行为我修复了它:

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

    修复来自https://github.com/dingo/api/issues/54

    【讨论】:

    • 你是天使。我无休止地敲了敲头,不知道出了什么问题。如果不是这个答案,我会继续在 URL 参数中使用令牌,如果你问我,这不是一个干净的方法。我已经筹集了一笔赏金,只要 Stack Overflow 允许我,我就会将它奖励给你。太感谢了。 :)
    • @Rohan。很高兴它也帮助了你。不要担心赏金。您的评论本身就是奖励。 :)
    【解决方案2】:

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

    【讨论】:

    • 我知道。我只是在调试时将该代码放在那里,并以某种方式找到了修复程序。我想做return Response::json(['error'=&gt;'Not authorized. Access token needed in Header.Authorization'], 403); 但我的问题是为什么Authorization 值在通过时为空。
    • 我不明白你在问什么 - 请用更多信息扩展你的问题。
    • 并非如此。为什么你认为如果返回 JSON 错误,$accessToken 会被神奇地填充?
    • 我不知道为什么。那就是问题所在。 :) 我想知道它是否与 apache 或我的代码有关。无论如何,如果我执行return 'Your Header.Authorization is: '. $accessToken;,它将始终返回Your Header.Authorization is: 。如果我做那个“神奇”的回报,我会得到我想要的结果。但我不希望“魔法”一直返回,只有当我真的没有设置 Header.Authorization 时。
    猜你喜欢
    • 2013-11-15
    • 2016-10-31
    • 1970-01-01
    • 2016-05-08
    • 2014-07-31
    • 2021-09-21
    • 2011-04-20
    • 1970-01-01
    • 2014-03-05
    相关资源
    最近更新 更多