2016-06-07 1 views
5

Sto usando e sto provando a utilizzare Canary tuttavia, non riesco a recuperare l'utente corrente, canary ha bisogno di current_user in conn.assigns, ho seguito this, se lo chiedo per (all'interno di un'azione di controllo):Impossibile ottenere l'utente corrente con guardiano

Guardian.Plug.authenticated?(conn) 

ottengo vero, ma se lo faccio:

Guardian.Plug.current_resource(conn) 

è solo vuota.

Ho questo codice nel mio api cantiere:

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  

e per 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 

Sessione creare metodo:

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 

Forse sono manca qualcosa.

Edit:

ho ottenuto che funziona modificando MyApp.Plug.CurrentUser come questo:

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 

Anche se funziona, forse c'è un modo migliore o in un altro modo come l'utilizzo di sign_in.

+1

Prova codice di cambiamento nella pipeline per VerifyHeader prima, poi LoadResource –

+0

Ho lo stesso problema. Dove sei in grado di risolverlo? – jasmo2

+0

Funziona per me come descritto nell'ultimo blocco di codice – kainlite

risposta

0

le versioni più aggiornate di Guardian, questo è il codice di lavoro:

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 
Problemi correlati