交响乐 |认证请求

Symfony | Authenticate request

我正在尝试创建一个类似于 "service" 的应用程序,它可以接收来自其他服务的 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 -?

与其将 headers 放入 JSON object HTTP body,不如直接使用 HTTP headers。这就是他们的目的。当您使用 non-standard headers 时,请为它们添加前缀 X- 并且可能是您的应用程序的前缀,例如 X-YourApp-Signature。请求进入 body,即您示例中 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),因此在实际应用中代码会稍微复杂一些。

正如 k0pernikus 提到的,before after filters 解决了我的问题。