エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

phx_gen_auth で認証したユーザを LiveView で参照するときの覚書

hex.pm

結論

LiveView モジュールの mount/3 関数の第二引数に "user_token" が設定されているので、phx_gen_auth が生成するモジュールに含まれる関数 get_user_by_session_token/1 を利用してユーザデータを取得する。

実例

アプリケーションを用意する

$ mix phx.new my_app --live
$ cd my_app

phx_gen_auth を追加する

mix.exsdepsphx_gen_auth を追加する。

このパッケージは開発時のみ利用し、また実行時には利用しないので only: :dev および runtime: false を指定する。

{:phx_gen_auth, "~> 0.4", only: :dev, runtime: false}

パッケージを取得しコンパイルする。

$ mix do deps.get, deps.compile

認証の仕組みを用意する

mix task の mix phx.gen.auth が有効になるので、これを利用して認証のリソースとコードを生成する。

$ mix phx.gen.auth Account User users
$ mix do deps.get, ecto.create, ecto.migrate

認証が必要な LiveView を追加する

lib/my_app_web/router.ex を編集して :require_authenticated_user が指定されているスコープに LiveView のルーティングを追加する。

  scope "/", MyAppWeb do
    pipe_through [:browser, :require_authenticated_user]

    live "/user", UserLive

    # ...
  end

lib/my_app_web/live/user_live.ex を作成して LiveView のモジュール MyAppWeb.UserLiveView を記述する。

このとき、mount/3 の第二引数のマップに、ログインしたユーザを識別するトーク"user_token" が設定されているので、mix phx.gen.auth で生成された MyApp.Account.get_user_by_session_token/1 を使ってそのユーザを取得する。

defmodule MyAppWeb.UserLive do
  use MyAppWeb, :live_view

  def mount(_params, session, socket) do
    current_user = MyApp.Account.get_user_by_session_token(session["user_token"])
    {:ok, assign(socket, current_user: current_user)}
  end

  def render(assigns) do
    ~L"""
    <h1><%= @current_user.email %></h1>
    """
  end
end

サーバを起動し動作を確認する

サーバを起動し、追加した LiveView の URL http://localhost:4000/user にアクセスする。

$ iex -S mix phx.server 

認証されていないのでログインページに移動する。

Register リンクをクリックし登録ページに移動する。

ユーザ登録が完了すると、LiveView のページが表示され、登録したメールアドレスが表示される。

いつか読むはずっと読まない:銃・病原菌・鉄

数年前に購入したままになっていた本。 たまたま先日見た番組に著者が出演していて、存在を思い出し読み始めたところ。

今、この時に、読むのが、よい気がしている。