2016-09-27 39 views
1

我想實現以下GitHub的問題由@hassox給出的建議是:守護者 - 「記住我」使用刷新標記

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

中,我產生一個用戶登錄以後令牌,並將其存儲在具有TTL一個cookie:

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) 

另外,我有一個插件(把下面Guardian.Plug.LoadResource)在我:browser_auth管道:

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

這裏的插件是什麼樣子的時刻:

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 

如何創建一個新的令牌,存儲在會話中,並繼續到所需頁面,而不是被重新路由到登錄頁面?

+0

這GitHub的問題包含地址的簡單解決方案這個問題 - https://github.com/ueberauth/guardian/issues/209 – Mitkins

回答

1

我猜的代碼可能是這樣的:

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 

而且在您的管道,把你的MyApp.Plug.RememberMeVerifySession 請試試,看看它是如何工作