Session

Builtin to Phoenix, session_opts defined in endpoint.ex

You can put and get things from the session then pass it into the render or I guess return it on api call

  • put_session(conn, key, value)

  • configure_session(conn, renew: true)

  • configure_session(conn, drop: true)

  • fetch_session(conn, opts \\ [])

  • get_session(conn) => all OR get_session(conn, key)

router.ex

#...
    get "/login", SessionController, :new
    get "/logout", SessionController, :delete
    resources "/sessions", SessionController, only: [:new, :create, :delete], singleton: true
#...

controllers/session_controller.ex

defmodule DiscussWeb.SessionController do
  use DiscussWeb, :controller

  alias Discuss.Accounts

  def new(conn, _) do
    render(conn, "new.html")
  end

  def delete(conn, _) do
    conn
    |> configure_session(drop: true)
    |> put_flash(:success, "Successfully signed out")
    |> redirect(to: "/")
  end

  def create(conn, %{"user" => %{"email" => email, "password" => password}}) do
    case Accounts.authenticate_by_email_password(email, password) do #write this ft in Accounts
      {:ok, user} ->
        conn
        |> put_flash(:info, "Welcome back!")
        |> put_session(:user_id, user.id) #Use an Auth Plug to lookup user
        |> configure_session(renew: true)
        |> redirect(to: "/")
      {:error, :unauthorized} ->
        conn
        |> put_flash(:info, "Bad email/password")
        |> redirect(to: Routes.session_path(conn, :new))
      {:error, :not_found} ->
        conn
        |> put_flash(:info, "Account not found!")
        |> redirect(to: Routes.session_path(conn, :new))
    end
  end
end

Plug

router.ex

lib/discuss_web/plugs/auth.ex

User_controller.ex

app.html.eex

Last updated