cakephp3-无法获取控制器内的授权头

时间:2017-04-04 11:21:26

标签: php cakephp cakephp-3.0

我正在使用CakePHP 3框架开发API。现在我从POSTMAN客户端发送GET请求。用户将在标头中传递API密钥。 enter image description here

我想在控制器功能中获取此标题。

这就是我的控制器的样子

namespace Api\Controller;
use Cake\Auth\DefaultPasswordHasher;
use Api\Controller\AppController;
use Cake\Cache\Cache;
use Cake\Http\ServerRequest;

class ApiController extends AppController
{
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('RequestHandler');
    }

    public function myinfo()
    {
        if($this->request->is('get')) { 
            $key = $this->request->getHeaderLine('Authorization');
            $this->set('key', $key);
        }
        $this->set('_serialize', ['key']);          
    } 
}

我得到的错误是:HeaderLine is not a function

我还尝试了更多选择:

$acceptHeader = $this->request->getHeader('Authorization');

但这也引发了类似的错误。标题不是函数。

参考:Link

CakePHP版本: 3.3.5

2 个答案:

答案 0 :(得分:3)

正如@ndm在OP评论中所说,链接文档中的最后一个示例应该可以解决您的问题。您使用的是3.4之前的版本,因此您必须使用:

// Prior to 3.4.0
$key = $this->request->header('Authorization');

答案 1 :(得分:2)

Reading HTTP Header

的参考文件

这里提到“允许您访问用于请求的任何HTTP_ *标头”。意味着它只读取像

这样的http标题
  • HTTP请求
  • 主机
  • 连接
  • 升级不安全-请求
  • 的User-Agent
  • 接受
  • 接受编码
  • 接受语言

还提到“虽然某些apache安装不能使Authorization标头可访问,但CakePHP将根据需要通过apache特定方法使其可用。”

所以对于解决方案

它们都有不同的模糊设置,你可以通过调整来否决这种行为,但是你需要准确确定应该归咎于哪个模块。

您可以通过env:

直接将标头传递给PHP来解决此问题
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

同样参考:Zend Server Windows - Authorization header is not passed to PHP script