Devise.rb設定ファイル項目まとめ

# イントロダクション
Railsで使用するDeviseの設定ファイルである「`/config/initializers/devise.rb`」。
Deviseをセッティングする上で不可欠なファイルではありますが、解説してある物が探しても無かったので、備忘録兼ねて作成しました。

英語が疎い上に、全ての機能を利用しているわけじゃないので間違っている可能性あります。
もしおかしい部分あったらズビズビっとご指摘下さいませ・・。

## 環境
- Rails 5.1.x
- Devise 4.7.1

## とてつもなく参考にさせて頂いたリンク
- [DeviseのREADMEを翻訳してみた](https://qiita.com/gakkie/items/6ef70c0788c3cbff81ee)
- [[Rails] Facebook/Twitter/Googleでのユーザー登録をDevise & Omniauthを使って爆速で実装する](https://qiita.com/kazuooooo/items/47e7d426cbb33355590e)
- [deviseを使ったログイン機能を実装する！メール認証機能付き](https://qiita.com/kskumgk63/items/aa581b6b3f8c66fa82e2)
- [RailsのDeviseで最低限付与したいセキュリティ設定](https://qiita.com/inodev/items/eeb26ea9408d4627bf0a)

それではいってみよー！

# Devise.rbの設定項目一覧
## Controller configuration / コントローラー
```ruby
# Deviseのコントローラーのクラス名
config.parent_controller = 'DeviseController'
```
デフォルト名のクラスを使いたくない場合などに指定します。普段は変更する必要はなさげ。

## Mailer Configuration / メーラー
```ruby
# Devise::Mailerに使用するメールアドレスを指定する。
# 独自のクラスを使用すると上書きされる。デフォルトでは、 「from」パラメータを使用。
config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'

# メーラーのクラス名
config.mailer = 'Devise::Mailer'

# メールを送信する親クラス名
config.parent_mailer = 'ActionMailer::Base'
```
メール認証を行う際のメールアドレスなどを設定する場所なのでお世話になる可能性は高そう。ただ、メールアドレス以外の部分は特にいじる必要はない感じです。

また、このメールアドレスを変更しただけでは機能しません。詳しくはこちらの記事が参考になります。
[deviseを使ったログイン機能を実装する！メール認証機能付き - Qiita](https://qiita.com/kskumgk63/items/aa581b6b3f8c66fa82e2)

## ORM configuration / ORM
```ruby
# 読み込むORM
require 'devise/orm/active_record'
```
使用したいORMを設定します。
ORMとは、`オブジェクト・リレーショナル・マッピング`の略で、SQL文の代わりに短い構文を使用してDB操作を可能とする物。

↓こんなやつです。

```ruby
User.all
```
デフォルトでは`ActiveRecord`が設定されています。

## Configuration for any authentication mechanism / 認証メカニズム
```ruby
# ユーザー認証時に使用するキーの設定。
# :email、:username、:subdomainが設定できる。
config.authentication_keys = [:email]

# 認証に使用するリクエストオブジェクト。
config.request_keys = []

# 大文字と小文字を区別しないキーを設定。デフォルトはemail。
config.case_insensitive_keys = [:email]

# 空白を除外するキーを設定。デフォルトはemai。
config.strip_whitespace_keys = [:email]

# パラメーターリクエストでの認証を許可するか。
# true、falseの代わりに:databaseを指定すると、databaseでのみ認証を許可する。
config.params_authenticatable = true

# HTTP認証(Basic認証)を有効化させるかどうか。基本はfalse。
# :databaseを指定するとデータベースのみに有効になる。
config.http_authenticatable = false

# 401ステータス時にAjaxリクエストを返すか。
# Ajaxで認証したい場合はfalse。
config.http_authenticatable_on_xhr = true

# Basic認証を使用する範囲。デフォルトでは「Application」。
config.http_authentication_realm = 'Application'

# パスワード変更を要求された際の動作を、入力されたemailの正誤に関わらず同じように振る舞うかどうか。
config.paranoid = true

# セッション処理をスキップする場所を設定する。
config.skip_session_storage = [:http_auth]

# CSRFトークンを固定化するとセキュリティリスクがある。
# その為、Ajaxリクエストを利用したサインアップを行うなら新しいCSRFトークンをサーバーから発行できる。
# 新しいトークン発行を許可するか？
config.clean_up_csrf_token_on_authentication = true

# Falseの場合はリロードしない。リロードしない場合はページ読み込み時間の短縮になるが、正しくDiveseをマッピングできない可能性がある。
# リロードするかどうか。
config.reload_routes = true
```
Basic認証なども入れられるようですね。
[gem deviseでAPIの認証を行う方法(Basic認証) - Qiita](https://qiita.com/camelmasa/items/6d317e6294f62faf4585)

Ajaxでログイン処理したい場合の設定などで編集する必要性が出てきそうです。
[Rails Devise Ajax ログイン・登録 - Qiita](https://qiita.com/kntmrkm/items/e217a7a8fcba066cc298)


## Configuration for :database_authenticatable / データベース認証
```ruby
# パスワードハッシュをtestで発行する回数。デフォルトは11回。
# 20の設定で既に1計算あたり20秒とかなり遅いので注意してねとのこと。
config.stretches = Rails.env.test? ? 1 : 11

# pepperをセットアップする時の生成ハッシュパスワードを設定。
config.pepper = ''

# ユーザーのemailが変更された時に元のメールへ通知メールを送るかどうか。
config.send_email_changed_notification = false

# ユーザーのパスワードが変更された時にメールへ告知のメールを送るかどうか。
config.send_password_change_notification = false
```
ユーザーのメール・パスワード変更された時の通知は設定しておいてあげると喜ばれそうです。セキュリティ向上にも繋がりますね。
通知設定は**メーラー設定が必要**なので、こちらも設定をいじるだけでは使えません。


## Configuration for :confirmable / メール認証
```ruby
# ユーザーがメール認証できなくてもWebサイトを閲覧できる期限。
# 0.days設定で閲覧不可。nilにすると認証されるまでアクセスし続けられる。
config.allow_unconfirmed_access_for = 2.days

# メール認証トークンを無効にするまでの期間。
config.confirm_within = 3.days

# メール変更時に変更することをメール認証にて確認するかどうか。
config.reconfirmable = true

# アカウント確認を行う時に使用するキーを指定。
config.confirmation_keys = [:email]
```
メール認証で必要な項目が詰まってます。
メーラーの設定と合わせて編集しとくと良さげです。

## Configuration for :rememberable / ログイン情報の保存
```ruby
# ログイン情報を保存する期間の設定。
config.remember_for = 2.weeks

# サインアウトした時にログイントークンを無効にするか。
config.expire_all_remember_me_on_sign_out = true

# Cookieを使用する場合にログイン可能期間を伸ばすか。
config.extend_remember_period = false

# Cookieを使用する際の値を設定可能。
# trueにするとSSLのみのCookieが強制される。
config.rememberable_options = {}
```

## Configuration for :validatable / バリデーション
```ruby
# パスワードの最小最大値の設定。
config.password_length = 6..128

# email登録時の正規表現パターン。
config.email_regexp = /\A[^@\s]+@[^@\s]+\z/
```

## Configuration for :timeoutable / タイムアウト
```ruby
# セッション接続が切れる時間。接続が切れると再びログイン認証を求められる。
# デフォルトは30分。
config.timeout_in = 30.minutes
```

## Configuration for :lockable / アカウントロック
```ruby
# アカウントロックに使用するストラテジー。
# :failed_attempts = 一定の試行回数を超えるとロック
# :none = アカウントをロックしない
config.lock_strategy = :failed_attempts

# ロック、アンロックするキー指定。デフォルトはemail。
config.unlock_keys = [:email]

# アカウントロックを解除する方法。
# :email = email認証で解除
# :time = 時間経過で解除
# :both = 上記の両方の方法で解除
# :none = 解除方法無し
config.unlock_strategy = :both

# アカウントロックするまでの試行回数指定。
config.maximum_attempts = 20

# アカウントロック解除までの時間指定。
config.unlock_in = 1.hour

# ログイン失敗時、アカウントロックする直前に警告するか。
config.last_attempt_warning = true
```

## Configuration for :recoverable / 復旧処理
```ruby
# パスワードを復旧する際に使用するキーを設定。
config.reset_password_keys = [:email]

# パスワードリセットしてから再設定可能な有効期限。
config.reset_password_within = 6.hours

# パスワードリセット完了後に自動でログイン状態にさせるか。
config.sign_in_after_reset_password = true
```

## Configuration for :encryptable / 暗号化
```ruby
# 使用する暗号化アルゴリズムを指定。
config.encryptor = :sha512
```
暗号化アルゴリズムとしてデフォルトで設定されているbcrypt以外にも他のハッシュを使用できるみたいです。
ただし、bycrypt以外のアルゴリズム使用時は、gem 'devise-encryptable'が必要となります。

:sha1、:sha512や、:cliarance_sha1、:authlogic_sha512、:restful_authentication_sha1を使用可能。

詳しい事は[こちら](http://hir-aik.hatenablog.com/entry/2014/10/03/181030)のブログが参考になりそうです。

## Scopes configuration / 許可範囲
```ruby
# カスタマイズビューを許可するか。
# trueにする事で、viewが編集可能になる。
config.scoped_views = false

# アカウントロックされてないユーザーを管理するモデル名を指定する。
config.default_scope = :user

# 全てのRoutingでサインアウトを許可するかどうか。
# もし、「/users/sign_out」でのみ許可したい場合などはfalseにする。
config.sign_out_all_scopes = true
```
基本的にViewの編集は必ず行うと思うので、この項目の編集は必須でしょう。

## Navigation configuration / ナビゲーション
```ruby
# ナビゲーションのフォーマット形式をリストで指定。
config.navigational_formats = ['*/*', :html]

# サインアウトで使用するルーティング。デフォルトは「:delete」。
config.sign_out_via = :delete
```
ナビゲーションのフォーマット形式をリストとして設定します。
:htmlはユーザーがアクセス出来ない場合にリダイレクトさせないといけないですが、:xmlや:json形式だと、401コードを返す必要があるようです。
また、IEには「\*/\*」を指定して対応します。

## OmniAuth / OmniAuth
```ruby
# 新しく提供されたOmniAuthの追加を行える。
# Wikiの情報をチェックしてmodelsとhooksの設定を行う。
config.omniauth :github, 'APP_ID', 'APP_SECRET', scope: 'user,public_repo'
```
OmniAuthを使用する際にここでSNSのAPIキーを設定。
Twitter認証やFacebook認証でも使用します。

御存知の通り、この設定はDeviseだけの設定なので、実際に認証を導入するには様々なプログラミング的実装が必要です。
もちろん、Githubに上げる際なども考慮して、APIキーは環境変数で記述し.envファイルなどで保管しつつ運用します。

## Warden configuration / Warden
```ruby
# もし別のストラテジー、Deviseでサポートしていないものや、
# 不具合のあるアプリを変更する場合などは、condig.wardenのブロックを使用して設定できる。
config.warden do |manager|
     manager.intercept_401 = false
     manager.default_strategies(scope: :user).unshift :some_external_strategy
end
```
WardenはDeviseが使用する認証フレームワークです。
Wardenが認証の仕組みを提供し、Deviseが認証方法までをパッケージ化して提供してくれるというイメージでしょうか。

## Mountable engine configurations / Mountable engine
```ruby
# 搭載するエンジン名が下記の場合、
# mount MyEngine, at: '/my_engine'
#
# 上記の例でconfig/routes.rbで「devise_for」を呼び出した時は以下の名前となる。
config.router_name = :my_engine

# OmuniAuthのpathを設定する場合に使用。
# 基本的に使用しなさそう。
config.omniauth_path_prefix = '/my_engine/users/auth'
```
Mountable engineとは、Railsアプリに他のRailsアプリをgemファイルとして組み込む方法。
ここでのengineはgem化したRailsアプリの事を指しています。

## Turbolinks configuration / ターボリンク
```ruby
# ターボリンクを使用している場合、リダイレクトを正しく行わせる為に
# 「Turbolinks::Controller」をインクルードする必要がある。
ActiveSupport.on_load(:devise_failure_app) do
  include Turbolinks::Controller
end
```

## Configuration for :registerable / 登録
```ruby
# パスワード変更後に自動的にサインインさせるかどうか。
config.sign_in_after_change_password = true
```

# まとめ
設定ファイルを眺めるだけで、Deviseがどれだけの事が出来るのかが分かるのが面白いですね。
非常にシンプルに使えて、かつ奥深く実用に耐えうるように設計されているという事が分かります。
一番面倒くさいであろう認証系を一挙に担ってくれるDevise。これからもRailsを使用するならお供する事が多そうです。