首页 > 解决方案 > Symfony | 验证请求

问题描述

我正在尝试创建一个类似“服务”的应用程序,它可以接收来自其他服务的 API 调用。(这些服务将被构建,用于不同的目的)。并且还能够将 API 调用发送给另一个。

他们发送和接受的每个请求都必须具有以下格式。

{
    header : {
        // some header information, like locale, currency code etc.
        signature : "some-hashed-data-using-the-whole-request"
    },
    request : {
        // the usable business data
    }
}

对于每个请求,我想附加一个哈希,它是从实际请求或无论如何生成的(用密码或任何类型的魔法添加)。目前它并不那么重要。我给signature这个领域起了名字。因此,对于每个收到的请求,我想signature从请求中复制它。如果signature我收到的与我生成的匹配,我让应用程序运行,否则会显示一些错误消息。

我已经阅读了几篇文章,但其中大部分是针对用户密码组合的。

我的问题不在于它是否是一个好的解决方案。我只想知道如何在 Symfony 4 中实现类似功能的中间件——比如在 laravel 中?

标签: phpsymfonysecurityauthenticationsymfony4

解决方案


与其将标头放入 HTTP 主体的 JSON 对象中,不如直接使用 HTTP 标头。这就是他们的目的。当您使用非标准标头时,请为它们添加前缀,X-也可以为您的应用程序添加前缀,例如X-YourApp-Signature. 请求进入正文,即request您示例中的属性值。

使用 Symfony 的服务器端非常简单:

public function someAction(Request $request)
{
    $signature = $request->headers->get("X-YourApp-Signature");
    $data = json_decode($request->getContent());

    // ... go on processing the received values (validation etc.)
}

如果您想用 PHP 编写 HTTP 客户端应用程序,我建议您使用Guzzle库。这是一个例子:

$headers = ["X-YourApp-Signature" => "your_signature_string"];
$data = json_encode(["foo" => "bar"]);
$request = new \GuzzleHttp\Psr7\Request("POST", "https://example.com", $headers, $data);
$client = new \GuzzleHttp\Client();
$response = $client->send($request, ["timeout" => 10]);
var_dump($response);

当然,您还需要实现一些错误处理等(HTTP 状态 >= 400),因此代码在实际应用程序中会稍微复杂一些。


推荐阅读