2016-06-07 22 views
5

Używam Guardian i próbuję użyć Canary jednak nie mogę pobrać bieżącego użytkownika, kanarek potrzebuje current_user w conn.assigns, podążam za this, jeśli zapytam for (wewnątrz działania kontrolera):Nie mogę uzyskać bieżącego użytkownika z opiekunem

Guardian.Plug.authenticated?(conn) 

uzyskać prawdziwe, ale jeśli mam zrobić:

Guardian.Plug.current_resource(conn) 

To jest po prostu puste.

Mam ten kod w moim api rurociągu:

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  

i dla 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 

Sesja stworzyć metodę:

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 

Może jestem po prostu czegoś brakuje.

Edit:

mam to działa przez zmianę MyApp.Plug.CurrentUser tak:

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 

Chociaż to działa, być może istnieje lepszy sposób lub inny sposób, jak przy użyciu sign_in.

+1

Spróbuj Kod zmiana w rurociągu do VerifyHeader, potem LoadResource –

+0

mam ten sam problem. Gdzie jesteś w stanie go rozwiązać? – jasmo2

+0

Działa to dla mnie, jak opisano w ostatnim bloku kodu – kainlite

Odpowiedz

0

Dla najnowszych wydań Guardian, jest to kod pracy:

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