代码之家  ›  专栏  ›  技术社区  ›  jaydel

HMAC,灵丹妙药,插件。Conn(试图多次调用读体)

  •  2
  • jaydel  · 技术社区  · 6 年前

    在Plug.Parsers.JSON将http请求放入管道之前,有些东西正在读取它的主体,我正在努力解决这个问题。因此,json插件中的read_body超时——不能读取两次。

    在我们的管道中的早期插件中有一个HMAC实现,在某些情况下它会读取主体。有没有一个模式,如何使用身体是表现在插头?我的意思是,如果我们只能读一次,而且它必须在Plug.Parsers.JSON中解码,那么……它就行不通了。

    接下来的问题。生成HMAC散列时是否需要包含请求体?我的意思是,我觉得我们必须这么做,但我觉得在这一点上我自己成了一个圈。

    谢谢!

    1 回复  |  直到 6 年前
        1
  •  3
  •   ryanwinchester    6 年前

    你可以通过一个 :body_reader 选择 Plug.Parsers 以便缓存主体以供以后使用。

    您不想在解析器之前读取主体,而是缓存主体以便以后从要散列它的插件中读取。

    Option :

    :身体阅读器 -替换(或包装)的可选方法 Plug.Conn.read_body/2 提供访问 在被解析和丢弃之前的原始体。它是标准的 格式 {Module, :function, [args]} (MFA)并默认为 {Plug.Conn, :read_body, []} .

    Example :

    有时您可能想定制解析器如何从 连接。例如,您可能希望缓存要执行的主体 稍后进行验证,如HTTP签名验证。这可能是 通过一个定制的身体读取器来实现,该读取器可以读取身体并存储 与此相关,例如:

    defmodule CacheBodyReader do
      def read_body(conn, opts) do
        {:ok, body, conn} = Plug.Conn.read_body(conn, opts)
        conn = update_in(conn.assigns[:raw_body], &[body | (&1 || [])])
        {:ok, body, conn}
      end
    end
    

    然后可以设置为:

    plug Plug.Parsers,
      parsers: [:urlencoded, :json],
      pass: ["text/*"],
      body_reader: {CacheBodyReader, :read_body, []},
      json_decoder: Jason
    

    它被加入了 Plug v1.5.1 .