6

我将 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 没有看到它的任何想法?

谢谢

4

5 回答 5

21

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

因此,您可以使用自定义标头,X-Bearer-Token: 123456789或者您可以尝试在您的.htaccess

RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
于 2013-10-18T08:30:47.320 回答
4

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

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

或者更具体地说:

$this->getRequest()->headers->get('Authorization');
于 2015-12-14T06:11:47.387 回答
4

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

于 2017-10-04T08:54:19.187 回答
1

似乎 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']);
        }
    }
于 2017-09-22T11:06:16.687 回答
0

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

于 2017-07-06T18:52:47.370 回答