認証周りの勉強がてらAikotobaというEmail/Passwordによるシンプルな認証ライブラリを作成しましたので使い方とかをメモしておきます。
Aikotobaとは?
Rails engineを使ったEmail/Passwordによるシンプルな認証ライブラリを作成できるライブラリです。
使い方は簡単で以下をGemfileに追記し、bundle install
後に
gem 'aikotoba'
Rails engineをmountし、
Rails.application.routes.draw do mount Aikotoba::Engine => "/" end
これだけでシンプルなEmail/Passwordによる会員登録及び認証の機能が使えるようになります。
あとは以下のような感じで認証用のHelperやログイン状態での認可用のメソッドを生やすとControllerやViewで分岐したり色々できるようになります。
class ApplicationController < ActionController::Base include Aikotoba::Authenticatable # NOTE: You can implement the get authenticated account process as follows. alias_method :current_account, :aikotoba_current_account helper_method :current_account # NOTE: You can implement the authorization process as follows def authenticate_account! return if current_account redirect_to aikotoba.new_session_path, flash: {alert: "Oops. You need to Signed up or Signed in." } end end
またオプションで以下のような機能も利用することができます。
- アカウント作成後にメール配信してEmailの確認を行う(DeviseのConfirmableっぽいやつ)
- 指定回数ログインに失敗した場合にアカウントをロックしアンロック用のURLを配信する(DeviseのLockableっぽいやつ)
- パスワード変更用のURLを配信しパスワード変更を行う(DeviseのRecoverableっぽいやつ)
詳しい使い方はREADMEを参照してください。
作成したモチベーション
作成したモチベーションは以下の用な感じです。
- 単純に認証周りの考慮すべきセキュリティ等々の実装の勉強をしたかった。
- 認証用のライブラリ、汎用性を考慮してる反面どれも実装が複雑で難しくなにか起きたときにモンキーパッチを当てて対応する等が難しかったので、Rails engineを使ったガッツリRailsに依存したシンプルな実装のライブラリがほしかった。
- 既存の認証用のライブラリだとbcryptが使われていることが多いかモダンなHashアルゴリズムを使いたかった(Argon2)
- Devise等デフォルトだとガッツリUserといったサービスのコアなドメインで認証用のロジックが含まれてしまうので、それを別のモデルにできるような設計にしたかった。
- 複数DB対応をデフォルトで考慮したい。
おわりに
個人的には割と読みやすくシンプルに実装できたのと勉強にもなり個人のWebサービスにも導入できたので満足しました🥳