Frameworkにおけるユーザ認証2018年11月28日takuruTweet初めにこんにちは。Railsを書いていますが、最近はElixirのPhoenixも勉強しています。Railsで作られていますが、同時編集に使うサーバにはPhoenixを使用しているためです。Frameworkです。いっても、その設計思想には大きく違う部分があります。PhoenixはRailsのように暗黙的に様々なことをやってはくれません。いえ、やってはくれないというより、やりません。見えるコード以上のことをやってしまうと、明解さが損なわれるということのようです。たしかに、Railsはrailに乗りさえすればコードの量は最小になりますが、実際には何が起きているかというのは熟練者じゃないとわからないものが多いですね。本記事の内容さて、多くのサービス開発において、メールアドレスとパスワードを使ったユーザ認証というものが存在します。Railsで開発する場合は、Deviseやsorceryのようなgemを使ってサクっと実装しますが、Phoenixの場合はどうなるのでしょうか。本記事ではElixirのユーザ認証関係のライブラリから、comeoninとguardianという2つを組み合わせ、メールアドレスとパスワードによるログインをPhoenixで実装してみました。comeoninはパスワードのハッシュ化を行うライブラリです。「argon2_elixir」も使用します。guardianはログインセッション周りを担当するライブラリです。使用した言語、ライブラリのバージョン情報です。endアプリケーション仕様なにはともあれ仕様を決めます。認証に使うユーザモデルはAdminとし、各ページのURLは次のように決めました。/admin/logoutログアウトを行うログアウト後はログイン画面にリダイレクト実装Guardianモジュールの用意guardianを扱うために、それ用のモジュールを用意します。次の2つの関数はこのモジュールで実装しなければいけないと決められている関数です。subject_for_tokenユーザを識別できる情報を返すようにします。resource_from_claimssubject_for_tokenの情報がclaims[“sub”]で参照できるので、そこからユーザを取得します。次の3つのパイプラインを用意します。関しては、それぞれエラー時の挙動を定義するErrorHandlerモジュールを用意します。PiepelineとGuardian、それからErrorHandlerを関連付けます。開発環境用のシークレットキーを設定します。ローカル環境なので適当な文字列を設定しました。各ページで必要なパイプラインを設定します。endAdminモデル作成ここからはモデルを作っていきます。ecto.gen.migration」を使ってAdminモデルのマイグレーションを作成します。必要なカラムは、ログインに使うemailと、ハッシュ化したパスワードを格納するpassword_hashの2つです。endend次はAdminモデルのモジュールです。true」を使用します。関数で、入力されたパスワードをArgon2によりハッシュ化にしています。endend認証モジュール用意コントローラで使用するための認証モジュールです。ログイン、ログアウト、パスワードチェックなどを実装します。endendログイン、ログアウト用のコントローラログイン、ログアウトを行うSessionControllerです。先程実装したAuthモジュールを使用しています。endendログインフォームログインフォームは次のようにしました。メールアドレスとパスワードを入力できます。</div>ログイン中のAdminを表示ログイン中のAdminを表示するには、コントローラで次のPlugを指定します。indexアクションのみで使うためこれにより、「conn.assigns[:current_admin]」で現在ログイン中のAdminを取得することができます。ログインのテスト何はともあれAdminを1つ作成しなければなりません。アクセスしてみるとログイン画面が出るはずです。終わりに以上で基本的なユーザ認証が実装できるようになります。Rails+deviseで実装するユーザ認証と比べると、Phoenix+Guardianの場合は書くことが多くなります。その分deviseと違って細かいカスタマイズがやり易いため、その点は良いと思います。「いいね!」で応援よろしくお願いします!このエントリーに対するコメントコメントはまだありません。date*日本語が含まれない投稿は無視されますのでご注意ください。fax.0422-26-9781お問い合わせはこちらからどうぞ。