【问题标题】:Symfony 2.3 getRequest()->headers not showing Authorization Bearer TokenSymfony 2.3 getRequest()->headers 不显示授权承载令牌
【发布时间】:2013-10-26 22:42:50
【问题描述】:

我将 Authorization: Bearer { Token } 作为 HTTP 请求传递给我的 Symfony Rest Controller。

我的要求:

GET /app_dev.php/api/members HTTP/1.1
Host: localhost
Authorization: Bearer 123456789
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

在我的控制器内部:

$this->getRequest()->headers;

由于某种原因,当我使用 Symfony 的 Request 方法时,我的控制器无法使用 Authorization 标头。当我使用 PHP 的 getallheaders() 时,授权标头按预期显示。关于为什么 Symfony 没有看到它的任何想法?

谢谢

【问题讨论】:

  • 我记得我在尝试访问 Symfony 中名为 webauth 的服务器参数时遇到了同样的麻烦。我的代码中有这个: $this->get('request')->server;如果这没有帮助,我将进一步研究我为获取服务器参数所做的工作
  • @Francesc - 我无法通过 $this->get('request')->server; 访问 Authorization 标头;

标签: symfony authorization token


【解决方案1】:

它很可能被 Apache 剥离。 Bearer 不是一个已知的方案,它是一种专有的。

因此,您可以使用自定义标头,例如 X-Bearer-Token: 123456789,也可以尝试在 .htaccess 中添加此重写条件

RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

【讨论】:

  • 如果 Apache 正在剥离“授权”,我是否可以通过原始 PHP 而不是 Symfony 访问它?我也尝试了 RewriteConds,没有成功。
  • 抱歉,我将重写条件放在 .htaccess 的底部没有结果,但是当我将代码放在 .htaccess 的顶部时,它确实有效。感谢您的帮助。
  • 你能补充一点关于 1. 为什么它对 PHP 的 getallheaders() 可见和 2. 为什么这个重写规则有效吗?
  • 有没有其他办法,不做rewrite condition in your .htaccess。我很困惑,因为某些客户端(例如 Android、iOS、Web 客户端/设备)无需重写条件即可正常工作。但是在使用 Android-React-Native 的时候,问题就存在了。
【解决方案2】:

这里的问题和接受的答案之间似乎存在脱节。如果 PHP 的 getallheaders() 可以使用 Authorization 标头,那么 Apache 显然不会剥离它。我猜这个问题与 Symfony 的使用有关。 $this->getRequest()->headers 不返回包含标题的对象,它返回一个 HeaderBag。假设标题对 getallheaders() 可见,这可行:

$this->getRequest()->headers->all();

或者更具体地说:

$this->getRequest()->headers->get('Authorization');

【讨论】:

  • 其实他是对的。如果您尝试使用 $headers = $request->headers->all() 获取作为标头一部分的 JSON Web 令牌,则返回的标头中没有“授权”键。 Apache 重写规则解决了这个问题
  • 我在 Symfony3 上遇到了同样的问题。我可以从原始 php 获取授权标头,但不能从 symfony
【解决方案3】:

你也可以使用 apache_request_headers();获取将具有授权标头的原始标头。

【讨论】:

    【解决方案4】:

    似乎 apache mod_php “吃掉”了授权标头。

    这对我有用:

    if (!$request->headers->has('Authorization') && function_exists('apache_request_headers')) {
            $all = apache_request_headers();
            if (isset($all['Authorization'])) {
                $request->headers->set('Authorization', $all['Authorization']);
            }
        }
    

    【讨论】:

      【解决方案5】:

      Symfony 正在使用 php 全局变量 $_SERVER 创建 Request->headers 变量,但 $_SERVER 不包含所有标题。要获取所有标题,您必须使用 php 本机函数 getallheaders() 更多信息:http://php.net/manual/en/function.getallheaders.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-28
        • 2016-10-31
        • 2020-04-28
        • 2020-09-24
        • 1970-01-01
        • 2021-01-17
        • 2018-07-04
        • 2021-08-28
        相关资源
        最近更新 更多