Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 卫报-“;“记住我”;使用刷新令牌_Elixir_Phoenix Framework_Remember Me_Refresh Token - Fatal编程技术网

Elixir 卫报-“;“记住我”;使用刷新令牌

Elixir 卫报-“;“记住我”;使用刷新令牌,elixir,phoenix-framework,remember-me,refresh-token,Elixir,Phoenix Framework,Remember Me,Refresh Token,我正试图实现@hassox在以下GitHub问题中给出的建议: 用户登录后,我将生成一个令牌并将其存储在具有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

我正试图实现@hassox在以下GitHub问题中给出的建议:

用户登录后,我将生成一个令牌并将其存储在具有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 )
此外,我在
:browser\u auth
管道中有一个插头(放在
Guardian.Plug.LoadResource
下面):

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

如何创建一个新令牌,将其存储在会话中并继续到所需页面,而不是重新路由到登录页面?

我猜代码可能是这样的:

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.RememberMe
放在
VerifySession

请试着看看它是如何工作的这个GitHub问题包含了一个解决这个问题的示例解决方案-