Невозможно получить текущего пользователя с опекуном

Я использую Guardian и пытаюсь использовать Canary однако, похоже, я не могу получить текущего пользователя, canary нужен current_user в conn.assigns, я следил за this, если я попрошу (внутри действия контроллера):

Guardian.Plug.authenticated?(conn)

Я понимаю, но если я это сделаю:

Guardian.Plug.current_resource(conn)

Просто пусто.

У меня есть этот код в моем конвейере API:

pipeline :private_api do
  plug :accepts, ["json"]
  plug Guardian.Plug.LoadResource
  plug Guardian.Plug.VerifyHeader

  plug Guardian.Plug.EnsureAuthenticated, handler: SessionController
  plug MyApp.Plug.CurrentUser
end    

и для MyApp.Plug.CurrentUser

defmodule MyApp.Plug.CurrentUser do
  def init(opts), do: opts

  def call(conn, _opts) do
    current_user = Guardian.Plug.current_resource(conn)
    Plug.Conn.assign(conn, :current_user, current_user)
  end
end

Метод создания сеанса:

 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)

        Plug.Conn.assign(conn, :current_user, user)

        conn
        |> put_status(:created)
        |> render("show.json", jwt: jwt, user: user)

      :error ->
        conn
        |> put_status(:unprocessable_entity)
        |> render("error.json")
    end
  end

Может я что-то упускаю.

Редактировать:

Я получил его, изменив MyApp.Plug.CurrentUser следующим образом:

defmodule MyApp.Plug.CurrentUser do
  alias MyApp.GuardianSerializer
  def init(opts), do: opts

  def call(conn, _opts) do
    current_token = Guardian.Plug.current_token(conn)
    case Guardian.decode_and_verify(current_token) do
      {:ok, claims} ->
        case GuardianSerializer.from_token(claims["sub"]) do
          {:ok, user} ->
            Plug.Conn.assign(conn, :current_user, user)
          {:error, _reason} ->
            conn
        end
      {:error, _reason} ->
        conn
    end
  end
end

Хотя это работает, может быть, есть способ получше или другой, например, с помощью sign_in.


person kainlite    schedule 07.06.2016    source источник
comment
Попробуйте сначала изменить код в конвейере на VerifyHeader, а затем на LoadResource   -  person Alex Troush    schedule 08.06.2016
comment
У меня такая же проблема. Где ты можешь это решить?   -  person jasmo2    schedule 21.08.2016
comment
У меня это работает, как описано в последнем блоке кода.   -  person kainlite    schedule 21.08.2016


Ответы (1)


Для последних выпусков Guardian это рабочий код:

defmodule MyApp.Plugs.CurrentUser do
  def init(opts), do: opts

  def call(conn, _opts) do
   current_token = Guardian.Plug.current_token(conn)
    case MyApp.Guardian.resource_from_token(current_token) do
      {:ok, user, claims} ->
            Plug.Conn.assign(conn, :current_user, user)
      {:error, _reason} ->
        conn
    end
  end
end
person W.M.    schedule 12.12.2017