はじめての devise でユーザ認証(試行錯誤記録)
本日は Rails のアプリにユーザ認証機能を付けます!
devise という gem を使います。
先に断っておきますが、試行錯誤を重ねたため、この記事の流れはちぐはぐかもしれません…😇
初めてdevise使った人のメモ程度に読んでいただけますと幸いです!
目次
1.ユーザ認証
ユーザ認証というのは、コンピュータにアクセスしようとするユーザが、アクセスを許可された本人かどうかを確認することです。
身の回りの例では、パスワードを使ったログイン機能や、ICカードや指紋を使った認証です🗝
2.devise を使ってみる
devise は rails のアプリでよく使われるユーザ認証プラグインです。
早速使ってみます!
2-1. deviseインストール
まず自分の rails アプリの Gemfile に以下の1行を追加します。
gem 'devise'
そしてコンソールでbundle install
を実行し、deviseをインストールします。
2-2. 初期セットアップ
続いて、deviseの機能を rails アプリで使えるようにしていきます。
コンソールで以下の順番で4つ実行します💪
rails g devise:install #全体のインストール rails g devise user #ユーザーモデルを作成 rails db:migrate #userテーブルを作成 rails g devise:views #ビューの作成
全体のインストールの時、コンソール上にセットアップ方法が出てきます。
ここに書いてあるとおり進めていきます。
まずconfig/environments/development.rb
に以下の1行を追加します💡
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
わたしの場合、コメントアウトで devise の設定であることをメモしておきました。
次にconfig/routes.rb
を確認します。
2行目のdevise_for
という行が自動で追加されています🌝
この時点で rails サーバを起動して routes を見てみると、以下のようになっています(抜粋)。
routes の見方はhttp://localhost:3000/rails/info/routes
に接続です🚗
この一覧はコンソールでrails routes
を実行しても見ることができます。
config/routes.rb
に以下の1行を追加します。
root to: "コントローラ名#ビュー名"
ここには各々rootパスに設定したいものを設定するそうです。
rootということなので、多分/
にアクセスした時の設定ですね😎
トップページにあたるところだと思います。
私はRailsの教科書で作ったbooks_appを使っているので、私の場合コントローラ名はbooks
、ビュー名はindex
になります。
books_contoroller.rb
というファイルがあるので、ひとまず先に進めるはず!👼👼
参考記事:Railsの教科書
2-3. カスタマイズ
ここからは自分でカスタマイズしていきます🎈
ログイン状態の確認
devise には、ページに飛んできた人がログイン状態かどうかを判定し、ログイン状態ならコンテンツを表示、ログイン状態でなければログインページに飛ぶという動作をするためのヘルパーが定義されています😊
/app/controllers/application_controller.rb
に以下の1行を書きます。
before_action :authenticate_user!
続いて/app/views/layouts/application.html.erb
に以下を追加します。
<% if user_signed_in? %> <p><%= link_to "ログアウト", destroy_user_session_path, method: :delete %></p> <% end %>
ここでlocalhost:3000
にアクセスすると、以下の画面になりました!
英語ですが、とりあえずログイン画面ができているようです。
メール認証
サインアップするユーザは、まず仮登録として登録メールアドレスにメールを送り、返信によって本登録とします。
/app/models/user.rb
に:confirmable
を追加することで、各種認証時の確認作業が定義できるようになります😐
5行目の最後のやつです👏
ここから試行錯誤していてかなり不安のある内容ですが、migrationファイルを作成します。
多分一度はうまくいかないので、次わかるようになったらちゃんと書きます😢
とりあえずやってみたこと。
rails g migration add_confirmable_to_devise
migrationファイルには以下のように書きます。
/db/migrate/yyyymmddxxxxxx_add_confirmable_to_devise.rb
という名前のファイルです。
沢山書いてありますが、コピペしたい方は以下のサイトを見てください😊😊
How To: Add :confirmable to Users · plataformatec/devise Wiki · GitHub
今回は7行目と18行目のコメントアウトを取り除きます。
書けたらコンソールでrails db:migrate
です!
ちなみに私は色々試行錯誤しているうちに devise に関する migration ファイルが2つできてしまってエラーが発生しました。
どちらか消すとうまくいきました!笑
その際、migrationファイルのConfirmable
に関する部分にコメントアウトがあれば外します。
migrationファイルを含むdb
ディレクトリ以下のファイルを修正した場合、コンソールでrails db:reset
をしないと反映されないです🤨
または db:drop
とdb:create
とdb:migrate
を順番に実行します!
SMTPサーバの設定
メール送信の設定ができたら、SMTPサーバの設定をします。
letter-opener
とletter-opener_web
という gem を使ってみます!
Gemfile のgroup :development
の中に以下の2文を追加し、bundle install
を実行します。
gem 'letter_opener' gem 'letter_opener_web'
/config/routes.rb
に以下を追加します。
if Rails.env.development? mount LetterOpenerWeb::Engine, at: "/letter_opener" end
10〜12行目のところですね👀
/config/environments/development.rb
には以下を追加します。
config.action_mailer.delivery_method = :letter_opener_web
キャプチャの64行目です!
これでlocalhost:3000/letter_opener
にアクセスするとrailsアプリから送信したメールが確認できるようになるはずです。多分。
サインアップ
railsサーバを起動して、サインアップ画面に行きます。
まだ日本語に対応していないので、英語のまま進めます。
(いじってる間にいつの間にかリンク増えてるのはすみません)
サインアウト
好きなところにサインアウト用のリンクを書きます。
私はとりあえず全部のページからサインアウトできるようにしました笑
3.i18nで多言語化
多言語化します!
devise-i18n
という gem を使います。
※ devise-i18n-views という gem は上記の gem に統合されたので使いません!!
Gemfileに以下の1文を追加し、bundle install
します。
gem 'devise-i18n'
これだけでロケールファイルがインストールされたことになるので、手動で yml ファイルを生成する必要はありません🙂便利〜!
インストールされたロケールファイルの中身は以下のリンクから確認できます。
あとはviewファイルのほうでちまちまとi18nに対応するようにt('.sign_in')
など書いていくだけです。
自分で書かなくてもいい方法がありそうでよくわからなかったので、もしご存知の方は教えてください〜😊
はじめてのdeviseについては以上です。
ちぐはぐな情報ですみません…次使うときはもっと整理できるよう善処します!💪