2016-09-27 3 views
1

Ich versuche, die Beratung durch @hassox in dem folgende GitHub Problem gegeben zu implementieren:Guardian - "Remember Me" mit Aktualisierungs-Token

https://github.com/ueberauth/guardian/issues/142

Nachdem der Benutzer anmeldet, ich bin ein Erzeugen Token und in einem Cookie gespeichert, die eine ttl hat:

claims = Guardian.Claims.app_claims 
|> Guardian.Claims.ttl({30, :days}) 

{:ok, token, full_claims } = Guardian.encode_and_sign(user, :remember, claims) 

thirty_days = 86400 * 30 

conn = put_resp_cookie(conn, "remember_me", token, max_age: thirty_days) 

Außerdem habe ich einen Stecker (nach unten Guardian.Plug.LoadResource setzen) in meiner :browser_auth Pipeline:

pipeline :browser_auth do 
    plug Guardian.Plug.VerifySession 
    plug Guardian.Plug.LoadResource 
    plug Zoinks.Plug.RememberMe 
end 

Hier ist, was die Plug wie im Moment aussieht:

defmodule Zoinks.Plug.RememberMe do 
    import Plug.Conn 
    import Guardian.Plug 

    def init(opts \\ %{}), do: Enum.into(opts, %{}) 

    def call(conn, opts) do 
    current_user = current_resource(conn) 

    if (current_user == nil) do 
     jwt = conn.req_cookies["remember_me"] 

     case Guardian.decode_and_verify(jwt) do 
     { :ok, claims } -> 
      if (claims |> Map.get("typ") == "remember") do 
      {:ok, remember_user } = load_resource(conn, claims, opts) 

      # This doesn't seem to do what I want 
      conn |> Guardian.Plug.sign_in(remember_user) 
      end 

     { :error, reason } -> 
      # Do something 
     end 
    end 
    end 
end 

Wie kann ich ein neues Token erstellen, zu speichern, die in der Sitzung und weiter auf die gewünschte Seite, statt umgeleitet werden zu die Anmeldeseite?

+0

Diese GitHub Ausgabe einer Probenlösung enthält, die Adressen Diese Frage - https://github.com/ueberauth/guardian/issues/209 – Mitkins

Antwort

1

Ich denke, der Code wie folgt sein könnte:

defmodule MyApp.Plug.RememberMe do 
    import Plug.Conn 
    import Guardian.Plug 

    def init(opts \\ %{}), do: Enum.into(opts, %{}) 

    def call(conn, _) do 
    current_user = current_resource(conn) 

    if (current_user == nil) do 
     jwt = conn.req_cookies["remember_me"] 
     case Guardian.decode_and_verify(jwt) do 
     { :ok, claims } -> 
      the_key = Map.get(claims, :key, :default) 
      put_session(conn, Guardian.Keys.base_key(the_key), jwt) 
     end 
    end 
    end 
end 

Und in der Pipeline, setzen Sie Ihre MyApp.Plug.RememberMe vor VerifySession Bitte versuchen und sehen, wie es funktioniert

Verwandte Themen