代码之家  ›  专栏  ›  技术社区  ›  Zoltán Fekete

Symfony |身份验证请求

  •  0
  • Zoltán Fekete  · 技术社区  · 6 年前

    我正在尝试创建一个类似“服务”的应用程序,它可以从其他服务接收API调用。(这些服务将用于不同的目的)。还可以将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 到这个领域。所以对于每一个收到的请求,我想复制这个 签名 从请求中。如果 签名 我收到的与我生成的匹配,我让应用程序运行,否则会显示一些错误消息。

    我已经读过几篇文章,但大多数是针对用户密码组合的。

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

    2 回复  |  直到 6 年前
        1
  •  0
  •   lxg    6 年前

    不要将头放入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.)
    }
    

    如果您想用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 status>=400),因此代码在实际应用程序中会更复杂一些。

        2
  •  0
  •   Zoltán Fekete    6 年前

    正如柯尼科斯所说 before after filters 解决了我的问题。