php - 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 中?
解决方案
与其将标头放入 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),因此代码在实际应用程序中会稍微复杂一些。
推荐阅读
- dart - 如何使用 Dart 命令行应用程序编写 QuizApp?
- c++ - 如何将类的对象传递给对象的类函数中的函数?
- javascript - Matter.JS 检测两个静态传感器之间的碰撞
- javascript - 从 window.digitalData.user 获取值
- python - 如何防止 ast.literal_eval 覆盖相同的键值?
- ionic-framework - 使用 ionic 版本 4 创建页面
- php - SELECT COUNT(*) 返回一个对象而不是一个整数
- c - 如何停止在我的 C 游戏中播放音频?
- ios - 如何启用多点触控一次选择多个集合视图单元格?
- ionic-framework - Ionic 4 Angular 6 创建应用程序不询问 Cordova 集成问题