检查我的 GET 请求是否有标头:令牌



我想发送一个带有或不带有"令牌"作为标头的请求。

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

  • 如果请求没有"令牌"作为标头:它将返回带有该item_id的项目

我正在使用Zend框架,在ItemResource中我有这种方法:

public function fetch($id)
{
}

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

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

您不必重新发明轮子,因为当您使用fetch方法时,Laminas API Tools 已经准备好了收到的标头。

具象状态转移 (REST)

休息资源通常会扩展LaminasApiToolsRestAbstractResourceListener类。本课程听LaminasApiToolsRestResourceEvent。幸运的是,此事件为您提供了一个请求对象,该对象还包含收到的标头数据。

<?php
declare(strict_types=1);
namespace MarcelV1RestExample;
use LaminasApiToolsRestAbstractResourceListener;
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()时返回一个LaminasHttpRequest实例。请求实例已包含您收到的所有请求标头。只需使用给定的名称调用getHeader,并作为第二个参数调用默认值,当未设置标头时,应返回该值。如果没有http_token标头,则结果将变为 null。

远程过程调用 (RPC)

由于 RPC 请求是使用 MVC 控制器类处理的,因此可以像在 rest 资源中一样轻松地获取请求。控制器类从LaminasMvcControllerAbstractActionController扩展而来, 已经包含一个请求实例。

<?php
declare(strict_types=1);
namespace MarcelV1RpcExample;
use LaminasMvcControllerAbstractActionController;
class ExampleController extends AbstractActionController
{
public function exampleAction()
{
$token = $this->getRequest()->getHeader('Authorization', null);

if ($token === null) {
// token was not set
}
}
}

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

结论

绝对不需要编码已经存在的东西。只需从事件或抽象控制器获取请求实例,然后检索所需的标头。请始终记住,在处理原始数据时,存在CRLF注入等安全方面。Laminas框架已经为您处理了所有这些。

此外,您可以通过调用->getHeaders()而不是->getHeader($name, $default)来检查所有收到的标头。您将获得一个包含所有已接收标头的LaminasHttpHeader实例。

您可以通过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 
}

最新更新