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.
Spróbuj Kod zmiana w rurociągu do VerifyHeader, potem LoadResource –
mam ten sam problem. Gdzie jesteś w stanie go rozwiązać? – jasmo2
Działa to dla mnie, jak opisano w ostatnim bloku kodu – kainlite