Deviseとは-コンセプトから使い方まで*2020年3月17日更新

Deviseの使用にあたり、READMEを確認いたしました。
折角なので、備忘録もかねて以下にまとめてみます。
（誤認識などございましたら、ご指摘いただけますと幸いです！）

#Deviseとは
Deviseとは、Railsのための認証ソリューションです。
（Gemの一種ですね。ログイン機能を実装したいときなどに使います。）

特徴
-Rack base
＊Rack：Rubyにおけるサーバとアプリケーション／フレームワーク間のインターフェースの役割を果たすライブラリ

-Railsエンジンに基づいたMVCソリューション

-複数のモデルに対して同時にサインイン可能

-モジュール性の概念に基づいている：本当に必要なものを使用してください
*モジュール性：モジュールによって構成される範囲の程度を示すもの。
モジュール性が低い=>プログラム内の任意の2つの部分が相互に関連することが多い場合
モジュール性が高い(devise)=>モジュール間のインターフェイスが定義されていて、それ以外の相互関連が存在しない


##Deviseを構成する10個のモジュール
-Database Authenticatable
:ユーザーがサインインしている間、ユーザーの信頼性を検証するために、パスワードをまとめてデータベースに保存する。認証はPOSTリクエストかHTTP基本認証で実行可能です。

-Omniauthable
:OmniAuth (https://github.com/omniauth/omniauth) 機能
＊OmniAuthについては、以下参照にあるQiitaの記事をご参照いただけると良いかと思います。

-Confirmable
:確認方法の記載されたメールを送って、サインイン中のアカウントが承認されているか確認する。

-Recoverable
:ユーザーのパスワードをリセットし、リセットの指示を送付する。

-Registerable
:登録プロセスを経由してユーザーのサインアップを処理し、それらのアカウントの編集と削除を可能にする。

-Rememberable
:セーブされたcookieからユーザーを記憶するために、トークンの生成とクリーニングを管理する。

-Trackable
:sign in count/timestamps/IP addressをトレースします。

-Timeoutable
:一定時間動きのないセッションを閉じます。

-Validatable
:メールとパスワードの検証を提供します。＊オプション機能且つカスタマイズ可能です。

-Lockable
:複数回サインインに失敗した場合にアカウントをロックします。メール経由もしくは一定時間経過後にアンロックされます。


＊モデルにおけるDevise methodは、必要な機能を自身で選択可能です。 

```
devise :database_authenticatable, :registerable, :confirmable, :recoverable, stretches: 13
```


#使い方
Devise 4.0はRails 4.1以降での使用可能。

```ruby:Gemfile
gem 'devise'
```
記載が終わりましたら、ターミナルでbundle installしましょう。

```
$ bundle install
```

続いて、Generetorを起動させてインストールします。

```
$ rails generate devise:install
```

さて、インストールが完了したら、モデルを生成しましょう。
下記コード入力にてMODELを生成できます。
Userモデルを生成したい場合は、以下のMODELをuserと記載ください。

```
$ rails generate devise MODEL
```

必要なモデルの生成が完了したら、migrateしましょう。

```
$ rails db:migrate
```
*Devise内に変更を行った時は、必ずサーバー（ターミナル）を再起動しましょう。エラーが出ます。

##ヘルパーメソッド
Deviseをインストールすることで使用できるヘルパーメソッドを紹介します。
ユーザー認証機能をセットする(バイスモデルを'User'とした場合)

```rb:controller
before_action :authenticate_user!
```
ユーザーがサインインしているかチェックする

```rb:controller/view
user_signed_in?
```

今サインインしているユーザー向け

```rb:controller
current_user
```

##Devise用のViewファイル作成
Devise向けにViewファイルを作成する時は、ターミナルにて以下コマンド入力しましょう。

```
$ rails generate devise:views
```
モデルが複数ある場合（user, adminなど）は以下のように記載することで、全てのモデルに適用できます。

```config/initializers/devise.rb
config.scoped_views = true 
```
viewsのカスタマイズは以下を参照して編集しましょう。

|   場所  |  該当画面     |
|:----------------:|:-----------------:|
| registrations/new     |新規登録画面   |
| registrations/edit           |            プロフィールなど編集画面 |
| sessions /new        |              ログイン画面 |
| passwords/new | メール送信画面(パスワード変更用) |
| passwords/edit| パスワード変更画面 |
| confirmations/new | メールによる認証を行う画面 |
| unlocks/new | アカウントのアンロック画面 |

##ストロングパラメータ
独自のviewをカスタマイズした場合、それぞれに属性を追加する必要があります。
デフォルトで設定されているのは以下の通り。
sign_in (Devise::SessionsController#create) 
　-認証キーのみ使用可能(例：email)
sign_up (Devise::RegistrationsController#create)
-認証キーとパスワード、パスワード認証が使用可能
account_update (Devise::RegistrationsController#update) 
-認証キーとパスワード、パスワード認証、現行パスワードが使用可能 

追加方法
最初にconfigure_permitted_parametersメソッドを設定。
その後、メソッド内にdevise_parameter_sanitizer.permit(追加したいメソッドの種類, keys: [追加したいパラメーター名])を追記しましょう。

```application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
   devise_parameter_sanitizer.permit(追加したいメソッドの種類, keys: [追加したいパラメーター名])
  end
end
```
#ログイン・ログアウト時の遷移先指定
通常、ログイン・ログアウトをしたときはroot_pathに遷移しますが、
この遷移先を指定する場合には以下の記述をすることで適用できます。

```application_controller.rb
#ログイン時
  def after_sign_in_path_for(resource)
    user_path(@user.id)
  end

#ログアウト時
  def after_sign_out_path_for(resource)
    root_path
  end
```




#参考
The Devise wiki:How toなど様々な情報あり。
https://github.com/plataformatec/devise/wiki

Bug reports
Deviseに関する不具合を発見した場合、ガイドラインに沿ってレポートください。
https://github.com/plataformatec/devise/wiki/Bug-reports
もし、セキュリティに関するバグの場合はGitHub issue truckerを使用せずに下記アドレスに送信ください。
opensource@plataformatec.com.br.

StackOverflow and Mailing List
何か疑問やコメントなどある場合はGitHub issue trackerではなく、StackOverflowを使用ください。
http://stackoverflow.com/questions/tagged/devise

Devise README
https://github.com/plataformatec/devise/blob/master/README.md

Rackとは
https://gihyo.jp/dev/serial/01/ruby/0023

モジュール性
https://ja.wikipedia.org/wiki/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB

Omniauthable（OAuth)とは
https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be

Rails deviseの導入とView + Controllerのカスタマイズ(sign_in/out後のpath指定など)
https://qiita.com/kumasuke/items/7d5c47b4a40f6912adf2#views%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA

以上となります。最後までご覧いただき、ありがとうございました！
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします！
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。