【问题标题】:Cannot get current user with guardian无法获得监护人的当前用户
【发布时间】:2016-10-08 00:21:51
【问题描述】:

我正在使用 Guardian 并尝试使用 Canary 但是,我似乎无法获取当前用户,canary 需要 conn.assigns 中的 current_user,如果我问的话,我已经关注 this for(在控制器动作中):

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。

【问题讨论】:

  • 尝试先将管道中的代码更改为VerifyHeader,然后是LoadResource
  • 我也有同样的问题。哪里可以解决?
  • 它适用于我,如最后一个代码块中所述

标签: elixir phoenix-framework


【解决方案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

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2015-09-09
    • 1970-01-01
    相关资源
    最近更新 更多