すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Rails

【Rails】 deviseの使い方とは?ログイン認証機能を実装しよう

ぴっかちゃん
ぴっかちゃん

deviseとは、railsのgemの一つでログイン認証機能を簡単に実装することができます。

deviseのインストール方法

この章では、ログイン認証についてとdeviseのインストール方法について1つ1つ丁寧に解説します。

ログイン認証ってなに?

ログイン認証とは簡単にいうとログイン、ログアウト機能のことです。
ログインするにはまずサインアップ(新規登録)をする必要があるので、ユーザー登録も必要になります。
これを自分で実装しようとすると非常に大変です。
ですがdeviseというgemを使えば簡単に実装することができます。

gemをインストールしよう

それではrailsのアプリにdeviseをインストールしてみましょう。
Gemfileの一番下にこのように記述してください。

Gemfile
1
gem 'devise'

その後、ターミナルでbundle installを行いましょう。
次にターミナルで下記のコマンドを実行してください。

ターミナル
1
$ rails g devise:install

以下のようにターミナルに出力されればインストールに成功しています。

deviseのインストール画像

ここで出力されるメッセージの内容を確認してみましょう。

1. 新規登録などで認証メールを送った際、メールの文中にある認証リンクのURLを設定します。
設定するファイルはconfig/environments/development.rbです。
出力された内容にある通り下記のように設定します。

config/environments/development.rb -->
1
config.action_mailer.default_url_options = { protocol: 'https', host: 'トップページアドレス' }

デフォルトだと{ host: 'localhost', port: 3000 }になっています。

2. ルートを設定します。
deviseだと会員登録完了後などにルートに飛ぶ設定になっているため、あらかじめconfig/routes.rbでルートを設定する必要があります。

3. フラッシュメッセージ用のタグをビューに埋め込みます。

ビューファイル
1
2
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

これはflashメッセージというもので、それぞれnotice,alertという変数に格納されています。
ログインした際やログアウトした際、フォームの送信エラーなど簡単な通知をしたい場合に使用します。
フラッシュメッセージを表示させたい時はこのコードを共通のビューであるapp/views/layouts/application.html.erbに追記します。

4. deviseのビューをカスタマイズする時は下記のコマンドを実行します。

ターミナル -->
1
$ rails g devise:views

deviseでは認証周りのビューファイルは最初から用意されています。
しかしデフォルトのビューは非常に簡素なので、自分でカスタマイズする際にはこのコマンドを使い、ビューファイルを作成し、作成されたファイルを編集します。

deviseの基本的な使い方

この章では、deviseの基本的な使い方について解説します。

deviseを使ってユーザーモデルを作ろう

認証が使えるモデルを作成する際には通常のモデルを作成するコマンドであるrails g model モデル名ではなく、rails g devise モデル名というコマンドを使います。

userというモデルを作成する際は下記のコマンドになります。

ターミナル -->
1
$ rails g devise user

このコマンドでモデルを作成するとログイン認証をするためのファイルが自動で作成され、認証機能を使えるようになります。
それと同時にroutes.rbdevise_for :usersが追記されます。
この記述により下記のようにサインアップや、ログインなど認証のためのルーティングが自動で作成されます。

サインアップ

devise_for :モデル名

devise_forはdeviseのヘルパーメソッドです。
:モデル名を指定すると認証に必要なルーティングを自動で設定してくれます。
この記述の追加と同時にマイグレーションファイルも作成されます。

deviseで定義されているモジュールを確認しよう

マイグレーションファイルを確認するとdeviseで定義されたモジュールの設定が書かれています。
それぞれのモジュールがどういう機能を持つのか確認しておきましょう。

DatabaseAuthenticatable

データベースに保存されたパスワードが正しいか検証をします。
同時にパスワードの暗号化も行います。

Recoverable

パスワードをリセットします。

Trackable

ログインした回数、最終ログイン日時、前回ログイン日時、最終ログインIP、前回ログインIPを保存します。

Confirmable

新規登録時にメール認証機能をつけます。

Lockable

ログインに何度も失敗すると、アカウントをロックします。
何回失敗するとロックするかはこのLockable内で指定します。

以上がマイグレーションファイルに設定されています。
初期状態だとコメントアウトされているものもあるので、使いたい場合はコメントアウトを外しておきましょう。

その他に用意されているモジュール

マイグレーションファイルに記述されている以外にもモジュールが用意されています。

Timeoutable

ログインしたままの状態で一定時間経つと自動でログアウトさせます。
デフォルトだと30分になっています。
有効期限を自身で設定したい場合はconfig/initializers/devise.rbに下記を追記します。

config/initializers/devise.rb -->
1
2
# 1ヶ月と指定
config.timeout_in = 1.month

次にrailsの有効期限を設定します。
config/initializers/session_store.rbを下記のように編集します。

config/initializers/session_store.rb -->
1
TechReviewSite::Application.config.session_store :cookie_store, key: '自分のアプリの設定_session', expire_after: 1.month'

こうすることにより1ヶ月はログインセッションが保持され、1ヶ月以内にアクセスすればさらに1ヶ月セッション時間が保持されます。

Validatable

Emailやパスワードのバリデーションを追加します。

Omniauthable

twitterやFacebookなどのSNS認証を追加します。

モジュールの使い方

これらのモジュールを使いたい場合はapp/models/users.rbで下記のように指定します。

app/models/users.rb -->
1
2
devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :validatable

上の指定だと5つのモジュールが使えます。
使いたいモジュールを追記すれば使用可能になります。

deviseのヘルパーメソッド

deviseでは便利なヘルパーメソッドがたくさん用意されています。
主なものを確認しておきましょう。
userの部分はモデル名になるので、rails g devise teacherでteacherモデルを作成している時はteacherなどに置き換えてください。

current_user

現在ログインしているユーザーのレコードを取得できます。
現在ログインしているユーザーのidを取得する際はcurrent_user.idで取得できます。

user_signed_in?

ユーザーがサインしていればtrueが、サインアウトしていればflaseが返ってくるメソッドです。
ビューでcurrrent_userを使う際、ログインしていない場合、エラーになってしまうので、このメソッドで条件分岐をする必要があります。

authenticate_user!

before_action :authenticate_user!みたいにbefore_actionと併用して使います。
この一文をコントローラーの最初に記述しておくことにより、ユーザがログインしていない場合はログインページにリダイレクトさせます。
投稿はログインしていないとできないようにする際などに使用します。
onlyexceptでアクションを設定することが多いです。

configure_permitted_parameters

作成したモデルにストロングパラメーターを追加したい場合に使用します。
デフォルトだとメールアドレスとパスワードのみストロングパラメーターがかかっています。

使用する際はapplication_controller.rbbefore_actionを使って記述します。

application_controller.rb -->
1
2
3
4
5
6
7
before_action :configure_permitted_parameters, if: :devise_controller?

#新規登録時のストロングパラメータに「nicknameカラム」の追加
def configure_permitted_parameters
    #新規登録時のストロングパラメータに「nicknameカラムとageカラム」の追加
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :age])
end

第一引数は下記のように指定できます。

・sign_up: 新規登録時
・sign_in: ログイン時
・account_update: 更新時

deviseの応用的な使い方

この章では、deviseの応用的な使い方について解説します。

deviseを日本語化しよう

デフォルト状態だとフラッシュメッセージなどが英語なので日本語に変更しましょう。
公式サイトにもやり方が載っています。
まずはconfig/application.rbに下記のコードを追記します。

config/application.rb -->
1
config.i18n.default_locale = :ja

次にconfig/localesフォルダ内にdevise.ja.ymlというファイルを作成します。
作成したファイルにこちらに掲載されている内容をコピーします。

もう一つconfig/localesフォルダ内にja.ymlというファイルを作成します。
作成したファイルにこちらに掲載されている内容をコピーします。
これで日本語化は完了です。

I18nについて詳しく知りたい方は、こちらの「I18n入門書」を参照してください。

ビューを変更しよう

投稿フォームのデザインはdeviseで用意されています。
ただシンプルなので自分のアプリに合ったデザインに変更するのが良いでしょう。
その際は下記のコマンドを入力します。

ターミナル -->
1
$ rails g devise:views

すると下記のようにviewsフォルダにdeviseフォルダが作成されます。

viewsの作り方

各フォルダがどのビューに対応しているか確認してみましょう。

フォルダ名 ファイル名 内容
confirmations new パスワード再発行時のフォーム
mailer 後述 送信されるメールの内容(下記に詳細)
passwords edit パスワード編集フォーム
passwords new パスワードを忘れた時のフォーム
registrations edit ユーザー情報編集フォーム
registrations new 新規登録のフォーム
sessions new ログインフォーム
shared _link 各フォームに表示されるリンクの部分テンプレート
unlocks new アカウントロック通知メールを送信するフォーム

フラッシュメッセージが表示されるようにしよう

フラッシュメッセージはログインした際や、何らかのエラーメッセージを簡易的に表示させるものです。
deviseでは自動的にフラッシュメッセージを表示してくれます。
そのための設定を行いましょう。

いろんなページで使うので部分テンプレートとして作成します。

部分テンプレート
1
2
3
4
5
6
<% if notice %>
  <p><%= notice %></p>
<% end %>
<% if alert %>
   <p><%= alert %></p>
<% end %>

フラッシュメッセージにはnoticealertの2種類があり、noticeはログインに成功した時とか、投稿に成功した時など動作が正常に動いた時などに表示されます。
それに対しalertは動作が失敗したりエラーが出た時に表示されます。
pタグにそれぞれスタイルを設定しておくと良いでしょう。

この部分テンプレートをフラッシュメッセージを表示させたい箇所で呼び出します。

メール認証機能をつけよう

deviseを使うとユーザー登録の時にメール認証機能をつけることができます。
メール認証は何かというとユーザー登録をした後、登録したメールアドレスにメールを送り、そのメール内にあるリンクをクリックするとユーザー登録が完了するという機能です。
実装するまでに手順を確認しておきましょう。

ユーザーモデルを編集しよう

メール認証機能を使うには上の説明でもあったようにdeviseで用意されているモジュールを使用します。
下記のようにuser.rb:confirmableを追記します。

app/models/user.rb -->
1
2
devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :trackable, :validatable, :confirmable

メール送信用サーバーの設定をしよう

次にメール送信用サーバーの設定をします。
config/environments/development.rbに下記のコードを追加します。

config/environments/development.rb -->
1
2
3
4
5
6
7
8
9
10
11
12
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :enable_starttls_auto => true,
  :address => "smtp.gmail.com",
  :port => 587,
  :domain => 'smtp.gmail.com',
  :user_name => "メールアドレス",
  :password => "パスワード",
  :authentication => 'login'
}

メールアドレスにはgmailでないとダメみたいなので、gmailで設定してください。
パスワードの部分はgmailのログインパスワードです。
もし二段階認証をしている場合はアプリパスワードというのを取得しなくてはなりません。

アプリパスワード

二段階認証をしている場合、その都度パスワードが変わるのでここでは直接記述することができません。
ですので二段階認証時のパスワードとは別にアプリパスワードというのを使用します。
アプリパスワードは下記の順番で取得することができます。

1. googleアカウントページへ行く。

2. セキュリティをクリックする。

セキリュティ

  1. 2段階認証プロセスがオンになっているのを確認し、アプリパスワードをクリックする。

アプリパスワード

  1. 本人認証後、下の画面になるので、「その他(名前を入力)」を選択し、自分のアプリ名を入力する。

自分のアプリ名

  1. アプリパスワードが生成されるので、コピーをする。

アプリ生成パスワード

これでアプリ生成パスワードが確認できました。
このパスワードを上のdevelopment.rbに記述しましょう。

devise.rbを編集しよう

次に「config/initialiezers/devise.rb」を編集します。
下記のコードを追記してください。

1
config.mailer_sender = 'アプリで使用するgmailアドレス'

これでメール認証の設定は完了です。

届くメールの内容を編集しよう

メール認証機能を実装するとユーザー登録やパスワードを変更する時にメールを送ることができるようになります。
デフォルトだとdeviseが作成した英語の内容になっているので、自分のアプリに応じて内容を差し替えます。
編集するファイルはapp/views/devise/mailerの中にあるファイルです。

メール設定

各ファイルがどの時に送られるメールなのかを確認してみましょう。

ファイル名 送られる時
confirmation_instructions.html.erb ユーザー登録をした時
password_change.html.erb パスワード変更が完了した時
reset_password_instructions.html.erb パスワードを忘れた時
unlock_instructions.html.erb アカウントがロックされた時

やや難易度は上がりますが、こちらの参考書ではPikawakaのログイン機能のようにOAuthを利用してGitHubでログイン機能が作れます。気になる方は挑戦してみましょう!

この記事のまとめ

  • deviseは認証機能を簡単に実装できるとても便利なGem
  • ログイン認証とは簡単にいうとログイン、ログアウト機能のこと
  • 認証モデルは、通常のモデル作成コマンドではなく、rails g devise モデル名を実行する