【问题标题】:Poison can't encode JSON (Phoenix)Poison 无法编码 JSON (Phoenix)
【发布时间】:2018-01-31 07:02:34
【问题描述】:

这种情况的延续:Can't understand destructuring in JWT auth (Phoenix)

我正在使用 JWT 和 Guardian 和 Comeonin 设置 API 身份验证。此操作似乎有效,因为从 iex 调用 user 并将其传递给 Guardian.encode_and_sign/2 给了我正在寻找的元组。

  def create(conn, %{"session" => session_params}) do
    case MyApp.Session.authenticate(session_params) do
    {:ok, user} ->
      {:ok, jwt, _full_claims} = user |> Guardian.encode_and_sign(:token)
      conn
        |> put_status(:created)
        |> render("show.json", jwt: jwt, user: user)
    :error ->
      conn
      |> put_status(:unprocessable_entity)
      |> render("error.json")
    end
  end

当我发出 curl 请求时,我在控制台中收到此错误:

[error] #PID<0.565.0> running MyApp.Endpoint terminated
Server: localhost:4000 (http)
Request: POST /api/v1/sessions
** (exit) an exception was raised:
    ** (Poison.EncodeError) unable to encode value: {nil, "users"}
        (poison) lib/poison/encoder.ex:383: Poison.Encoder.Any.encode/2
        (poison) lib/poison/encoder.ex:227: anonymous fn/4 in Poison.Encoder.Map.encode/3
        (poison) lib/poison/encoder.ex:228: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3
        (poison) lib/poison/encoder.ex:228: Poison.Encoder.Map.encode/3
        (poison) lib/poison/encoder.ex:227: anonymous fn/4 in Poison.Encoder.Map.encode/3
        (poison) lib/poison/encoder.ex:228: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3
        (poison) lib/poison/encoder.ex:228: Poison.Encoder.Map.encode/3
        (poison) lib/poison/encoder.ex:227: anonymous fn/4 in Poison.Encoder.Map.encode/3
        (poison) lib/poison/encoder.ex:228: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3
        (poison) lib/poison/encoder.ex:228: Poison.Encoder.Map.encode/3
        (poison) lib/poison.ex:41: Poison.encode!/2
        (phoenix) lib/phoenix/controller.ex:740: Phoenix.Controller.do_render/4
        (myapp) web/controllers/api/v1/sessions_controller.ex:1: MyApp.SessionsController.action/2

我应该寻找什么来解决这个问题?

【问题讨论】:

    标签: authentication elixir jwt phoenix-framework elixir-poison


    【解决方案1】:

    看看这个issue

    您正在将私有元数据信息编码到客户端。

    但是,Poison@derive 属性中有一个 :except 选项,它可以从编码结果中排除一个键:

    defmodule User do
      @derive {Poison.Encoder, except: [:__meta__]}
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      • 2016-11-19
      • 2018-05-13
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多