Я пытаюсь создать "сервисное" приложение, которое может принимать вызовы 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, который я получил, совпадает с тем, который я сгенерировал, я позволяю приложению работать, в противном случае отображается сообщение об ошибке.
Я уже прочитал несколько статей, но большинство из них посвящено комбинациям ввода пользователя.
Мой вопрос не в том, хорошее это решение или нет. Я просто хочу знать, как можно реализовать функциональность, подобную промежуточному программному обеспечению, как в laravel, в Symfony 4?
Вы читали о до и после фильтров?
Я начал с сайта Аутентификация ключа API, но и это проверю.






Вместо того, чтобы помещать заголовки в объект JSON, тело HTTP, используйте заголовки 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.)
}
Если вы хотите написать клиентское приложение HTTP на PHP, я бы рекомендовал использовать библиотеку Жрать. Вот пример:
$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), поэтому код в реальном приложении будет немного сложнее.
Знаю, что могу поставить эту подпись и в шапку. На данный момент это не важно. Я тоже знаю про Guzzle, но это тоже не мой вопрос. Дело в том, что я не должен выполнять эту «аутентификацию» в контроллере и копировать и вставлять эту аутентификацию на все остальные контроллеры, которые у меня будут. Или скопируйте и вставьте вызов метода. Я должен был реализовать какое-то промежуточное программное обеспечение до того, как будет вызван какой-либо метод контроллера. То же, что и в Laravel.
Тогда вам, возможно, стоит уточнить свой вопрос.
Как упоминал k0pernikus, до после фильтров решает мою проблему.
Ответ вам помог? Если нет, не могли бы вы прокомментировать, что неясно? В противном случае, пожалуйста, посмотрите Что мне делать, когда кто-то отвечает на мой вопрос?