deviseのインストールと設定方法

目次

Railsでユーザー管理に使われるdeviseのインストールや設定方法を書きました。

概要

Railsでは、ユーザー管理によくdeviseというgemが使われます。

ユーザー管理の機能を自前で実装すると、結構面倒なのですが、deviseを使うとOAuth認証なども簡単に設定できます。

今回は、このdeviseのインストールと設定方法をまとめました。

deviseのインストール

deviseを使うことができるように、Gemfileに下記の内容を追記します。

gem 'devise'

そのあと、bundle installを実行して、deviseをインストールします。

deviseの設定

deviseは、使う前に設定ファイルをconfigディレクトリ内に配置する必要があります。

配置には、下記のコマンドを実行します。

rails generate devise:install

そして、ユーザー登録ではメールを送信するので、メール送信のための設定を追加する必要があります。

今回は、development環境で使うことを想定しているので、config/environments/development.rbに下記の文を追記します。

config.action_mailer.default_url_options = {host: 'localhost', port: 3000}

このままでは、ユーザー登録時などのエラーメッセージが英語なので、下記の翻訳ファイルをconfig/locales/devise.ja.ymlという名前で保存します。

# Additional translations at https://github.com/plataformatec/devise/wiki/I18n

ja:
  devise:
    confirmations:
      confirmed: "アカウントが確認されました。ログインしています。"
      send_instructions: "アカウントの確認方法を数分以内にメールでご連絡します。"
      send_paranoid_instructions: "ご登録のメールアドレスが保存されている場合、アカウントの確認方法をメールでご連絡します。"
    failure:
      already_authenticated: "既にログインしています。"
      inactive: "Your account is not activated yet."
      invalid: "Invalid email or password."
      locked: "アカウントがロックされています。"
      last_attempt: "あなたのアカウントがロックされる前に、もう1つの試みを持っています。"
      not_found_in_database: "メールアドレスまたはパスワードが無効です。"
      timeout: "一定時間が経過したため、再度ログインが必要です"
      unauthenticated: "ログインまたは登録が必要です。"
      unconfirmed: "本登録を行ってください。"
    mailer:
      confirmation_instructions:
        subject: "アカウントの登録方法"
      reset_password_instructions:
        subject: "パスワードの再設定"
      unlock_instructions:
        subject: "アカウントのロック解除"
    omniauth_callbacks:
      failure: "%{kind} から承認されませんでした。理由:%{reason}"
      success: "%{kind} から承認されました。"
    passwords:
      no_token: "このページにアクセスする事が出来ません。正しいURLでアクセスしている事を確認して下さい。"
      send_instructions: "パスワードのリセット方法を数分以内にメールでご連絡します。"
      send_paranoid_instructions: ""
      updated: "パスワードを変更しました。"
      updated_not_active: "パスワードを変更しました。"
    registrations:
      destroyed: "アカウントを削除しました。またのご利用をお待ちしております。"
      signed_up: "アカウント登録を受け付けました。"
      signed_up_but_inactive: "アカウントは登録されていますが、アクティブになっていないため利用できません。"
      signed_up_but_locked: "アカウントは登録されていますが、ロックされているため利用できません。"
      signed_up_but_unconfirmed: "確認メールを登録したメールアドレス宛に送信しました。リンクを開いてアカウントを有効にして下さい。"
      update_needs_confirmation: "アカウント情報が更新されました。更新の確認メールを新しいメールアドレス宛に送信しましたので、リンクを開いて更新を有効にして下さい。"
      updated: "アカウントが更新されました。"
    sessions:
      signed_in: "ログインしました。"
      signed_out: "ログアウトしました。"
    unlocks:
      send_instructions: "アカウントのロックを解除する方法を数分以内にメールでご連絡します。"
      send_paranoid_instructions: "アカウントが存在する場合、ロックを解除する方法をメールでご連絡します。"
      unlocked: "アカウントのロックが解除されました。ログインしています。"
  errors:
    messages:
      already_confirmed: "は既に登録済みです。ログインしてください"
      confirmation_period_expired: "%{period}以内に確認する必要がありますので、新しくリクエストしてください。"
      expired: "有効期限切れです。新規登録してください。"
      not_found: "は見つかりませんでした。"
      not_locked: "ロックされていません。"
      not_saved:
        one: "エラーにより、この %{resource} を保存できません:"
        other: "%{count} 個のエラーにより、この %{resource} を保存できません:"

そして、railsのlocaleを日本語にするために、config/application.rbに下記の内容を追加します。

config.i18n.default_locale = :ja

この後は、ユーザーの情報を格納するモデルを作成します。

ここでは、Userという名前でモデルを作ります。

下記のコマンドでモデルを作成します。

rails generate devise User

deviseでは、OAuth認証やログイン失敗回数でのアカウントのロックなどの機能がモジュールとして提供されています。

そのモジュールの有効・無効化は、モデルのファイルで変更します。

今回の場合は、app/models/user.rbで変更します。

最初の状態では、下記のようになっています。

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable
end

devise以降に書かれているモジュールが有効になっています。

各モジュールの説明は、下記に記しておきます。

database_authenticatable

サインイン時に、ユーザーの正当性を検証するためにパスワードを暗号化してDBに登録します。認証方法は、POSTリクエストかHTTP Basic認証が使えます。

使用する場合は、migrationファイルの下記の行のコメントを解除しておきます。

## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
add_index :users, :email, unique: true

registerable

登録処理を通してユーザーをサインアップします。また、ユーザー自身がアカウントを編集したり削除することを許可します。

recoverable

パスワードのリセット機能を提供し、それをメールによって通知します。

使用する場合は、migrationファイルの下記の行のコメントを解除しておきます。

## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
add_index :users, :reset_password_token, unique: true

rememberable

保存されたcookieから、ユーザーを記憶するためのトークンを生成・削除します。

使用する場合は、migrationファイルの下記の行のコメントを解除しておきます。

## Rememberable
t.datetime :remember_created_at

trackable

サインイン回数や、サインイン時間、IPアドレスを記録します。

使用する場合は、migrationファイルの下記の行のコメントを解除しておきます。

## Trackable
t.integer :sign_in_count, default: 0, null: false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip

validatable

メールやパスワードのバリデーションを提供します。独自に定義したバリデーションを追加することもできます。

confirmable

メールに記載されているURLをクリックして本登録を完了するという登録方法を提供します。

また、サインイン中にアカウントが認証済みかどうかを検証します。

使用する場合は、migrationファイルの下記の行のコメントを解除しておきます。

## Confirmable
t.string :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
t.string :unconfirmed_email # Only if using reconfirmable
add_index :users, :confirmation_token, unique: true

locakable

一定回数サインインを失敗するとアカウントをロックします。ロック解除にはメールによる解除か、一定時間経つと解除するといった方法があります。

使用する場合は、migrationファイルの下記の行のコメントを解除しておきます。

## Lockable
t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
t.string   :unlock_token # Only if unlock strategy is :email or :both
t.datetime :locked_at
add_index :users, :unlock_token, unique: true

timeoutable

一定時間活動していないアカウントのセッションを破棄します。

omniauthable

intridea/omniauthをサポートします。TwitterやFacebookなどの認証を追加したい場合はこれを使用します。

まとめ

結構、設定が面倒ではありますが、その分できることも大きいので、まあこのようなものかなとも思っています。

使いこなして、早くアプリケーションを作れるようになりたいと思います。