简体   繁体   English

监护人-使用刷新令牌“记住我”

[英]Guardian - “Remember Me” using refresh token

I'm trying to implement the advice given by @hassox in the following GitHub issue: 我正在尝试在以下GitHub问题中实施@hassox给出的建议:

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

After the user logs in, I'm generating a token and storing it in a cookie that has a ttl: 用户登录后,我正在生成令牌并将其存储在具有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 )

In addition, I have a Plug (to put underneath Guardian.Plug.LoadResource ) in my :browser_auth pipeline: 另外,我的:browser_auth管道中有一个Plug(放在Guardian.Plug.LoadResource下面):

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

Here's what the Plug looks like at the moment: 这是此刻的外观:

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

How do I create a new token, store that in the session and continue on to the desired page, instead of being re-routed to the sign-in page? 如何创建一个新令牌,将其存储在会话中并继续到所需页面,而不是重新路由到登录页面?

I guess the code could be like this: 我猜代码可能是这样的:

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

And in your pipeline, put your MyApp.Plug.RememberMe before VerifySession Please try and see how it works 👍 而在您的管道,把你的MyApp.Plug.RememberMeVerifySession请试试,看看它是如何工作👍

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM