首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用guardian获取当前用户

无法使用guardian获取当前用户
EN

Stack Overflow用户
提问于 2016-06-08 06:37:53
回答 1查看 1.8K关注 0票数 8

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

代码语言:javascript
复制
Guardian.Plug.authenticated?(conn)

我是真的,但如果我真的这么做了:

代码语言:javascript
复制
Guardian.Plug.current_resource(conn)

一片空白。

我的api管道中有以下代码:

代码语言:javascript
复制
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的

代码语言:javascript
复制
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

会话创建方法:

代码语言:javascript
复制
 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使其正常工作:

代码语言:javascript
复制
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这样的另一种方式。

EN

回答 1

Stack Overflow用户

发布于 2017-12-12 19:19:29

对于最新版本的Guardian,以下是工作代码:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37690530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档