【问题标题】:Check if my GET request has Header: Token检查我的 GET 请求是否有 Header: Token
【发布时间】:2022-06-24 15:25:00
【问题描述】:

我想发送带有或不带有“令牌”作为标头的请求。

  • 如果请求以 'Token' 作为标头:如果用户已经拥有该项目,它将返回具有特定用户正确 item_id 的项目(基于其令牌),否则将返回 null。

  • 如果请求没有 'Token' 作为标头:它将返回具有该 item_id 的项目

我正在使用 Zend Framework,在 ItemResource 中我有这个方法:

public function fetch($id)
    {
}

如何检查我的请求是否有 Token 作为标头并在 fetch() 中实现这两种情况?

【问题讨论】:

  • 所以获取标题并检查它是否具有身份验证令牌。

标签: php zend-framework laminas-api-tools


【解决方案1】:

Laminas API 工具取决于您使用的是 RPC 还是 REST 资源。我将解释 Laminas API 工具为您提供哪些工具来评估接收到的标头数据。

您不必重新发明轮子,因为当您使用 fetch 方法时,Laminas API Tools 已经在手边接收到了标头。

具象状态转移 (REST)

Rest 资源通常扩展 \Laminas\ApiTools\Rest\AbstractResourceListener 类。这个类监听\Laminas\ApiTools\Rest\ResourceEvent。幸运的是,此事件为您提供了一个请求对象,其中还包含接收到的标头数据。

<?php
declare(strict_types=1);
namespace Marcel\V1\Rest\Example;

use Laminas\ApiTools\Rest\AbstractResourceListener;

class ExampleResource extends AbstractResourceListener
{
    public function fetch($id)
    {
        // requesting for an authorization header
        $token = $this->getEvent()->getRequest()->getHeader('Authorization', null);
    
        if ($token === null) {
            // header was not received
        }
    }
} 

如您所见,ResourceEvent 在调用 getRequest() 时返回一个 \Laminas\Http\Request 实例。请求实例已包含您收到的所有请求标头。只需使用给定名称调用getHeader,并将默认值作为第二个参数,当标头设置为 noch 时,应返回该默认值。如果没有 http_token 标头,则结果为 null。

远程过程调用 (RPC)

由于 RPC 请求是使用 MVC 控制器类处理的,因此您可以像在休息资源中一样简单地获取请求。控制器类扩展自 \Laminas\Mvc\Controller\AbstractActionController,它已经包含一个请求实例。

<?php
declare(strict_types=1);
namespace Marcel\V1\Rpc\Example;

class ExampleController extends AbstractActionController
{
    public function exampleAction()
    {
        $token = $this->getRequest()->getHeader('Authorization', null);
        
        if ($token === null) {
            // token was not set
        }
    }
}

正如您所见,在 rpc 请求中获取标头数据与在资源侦听器中一样简单。过程相同,因为这里也使用了请求实例。

结论

绝对不需要编码已经存在的东西。只需从事件或抽象控制器中获取请求实例并检索所需的标头即可。此外,您可以通过调用-&gt;getHeaders() 而不是-&gt;getHeader($name, $default) 来检查所有收到的标头。您将获得一个 \Laminas\Http\Header 实例,其中包含所有接收到的标头。

【讨论】:

    【解决方案2】:

    您可以通过getallheaders() 获取所有HTTP 标头值,或者仅通过$_SERVER['HTTP_XXX'] 获取特定值,在您的情况下,将XXX 替换为Token$_SERVER['HTTP_Token']

    手册:https://www.php.net/manual/en/reserved.variables.server.php

    public function fetch($id)
    {
        $token = $_SERVER['HTTP_Token'];
        // do your busniess code 
    }
    

    【讨论】:

    • 拒绝投票的解释:Laminas API 工具手头有所有请求标头,并为您提供工具,为您处理标头数据。无需处理原始标头数据,因为 API 工具会为您考虑安全处理和安全问题。
    猜你喜欢
    • 2011-08-31
    • 2019-04-18
    • 2014-01-30
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多