开始登录后,用户不会持续



我正在使用Guardian构建我的第一个Elixir应用程序,并且我遇到了一个问题,用户可以登录并进行身份验证,但是重定向到下一页,conn不再存储用户,则信息和Guardian.Plug.is_authenticated?返回false。

session_controller.ex

  ....
  def create(conn, %{"session" => %{"email" => email, "password" => password}}) do
    case PhoenixApp.Auth.authenticate_user(email, password) do
      {:ok, user} ->
        conn
        |> PhoenixApp.Auth.login(user)
        |> put_flash(:info, "Welcome back!")
        |> redirect(to: "/users")
      {:error, _reason} ->
        conn
        |> put_flash(:error, "Invalid username or password.")
        |> render("new.html")
    end
  end
  ...

router.ex

  ...
  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
  end
  scope "/", PhoenixAppWeb do
    pipe_through [:browser]
    get "/signup", UserController, :new
    get "/login", SessionController, :new
    post "/login", SessionController, :create
    delete "/logout/:id", SessionController, :delete
  end
  scope "/", PhoenixAppWeb do
    # Protected routes
    pipe_through [:browser, :auth]
    resources "/users", UserController, except: [:new]
    get "/", PageController, :index
  end
  # Auth pipeline
  pipeline :auth do
    plug(PhoenixApp.Auth.AuthAccessPipeline)
  end
  ...

auth.ex

  ...
  def login(conn, user) do
   conn
    |> Guardian.Plug.sign_in(user)
    |> assign(:current_user, user)
    |> IO.inspect
    |> put_user_token(user)
  end
  ...

auth_access_pipeline.ex

defmodule PhoenixApp.Auth.AuthAccessPipeline do
  @moduledoc false
  use Guardian.Plug.Pipeline,
    otp_app: :phoenix_app,
    error_handler: PhoenixApp.Auth.AuthErrorHandler
  plug(Guardian.Plug.Pipeline,
    module: PhoenixApp.Guardian,
    error_handler: PhoenixApp.Auth.AuthErrorHandler
  )
  plug(Guardian.Plug.VerifySession, claims: %{"typ" => "access"})
  # plug(Guardian.Plug.EnsureAuthenticated)
  # plug(Guardian.Plug.LoadResource)
end

我的login方法中的IO.inspect(conn)返回刚刚在current_user下签名的用户的JSONIFIED用户结构,并且还在assigns密钥中登录,并用令牌存储user_token。如果您在重定向到/users后检查conn,则分配中的current_usernil,并且没有user_token

HTTP协议无状态。这意味着redirect_to什么都没有返回,然后浏览器的指令如何加载另一个(下一个(页面

conn 在调用redirect后所有存储的用户资源和令牌中消失。

现在,浏览器启动新连接到服务器,该连接创建绝对新的 conn ,对以前的群集(。

那么,如何"存储状态"(在我们的情况下 - 用户资源( connections?

cookies 当然。一个人应该在一个请求中在cookie内部放置用户令牌,然后在所有下一个请求中从cookie中检索令牌。

相当地说, Guardian 有两种不同的方法来存储和检索cookie中/从cookie中:直接带有remem_me/verifyefifycookie插件或带有会话:put_session_token/verifysession插件

put_session_tokensign_in内部自动调用,因此您的管道应包括与会话一起使用的插头。

相关内容

  • 没有找到相关文章

最新更新