TL;DR
認証キーと許可するパラメータの違いを把握していなかった。
- config.authentication_keysはdeviseの認証として使われるものであり、自動的にストロングパラメータとして登録されている
- devise_parameter_sanitizer.permitはストロングパラメータの設定であり、deviseの認証として使われるものではない
誤解していたこと
devise_parameter_sanitizer.permitとconfig.authentication_keysは同じもの!
↑誤りですので気をつけてください。。
つまり、
devise_parameter_sanitizer.permit(:sign_in, keys: [:name])
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
config.authentication_keys = [:name]
「この2つはsign_inとsign_upに関しては同じことである。」、「どちらの記述でも同じ!」と思っていました、、((反省
config.authentication_keysは何か
config.authentication_keysは認証用のキーであるため、「本当にあなたか確認しますね」ということです。どうやって確認するかというと、ここで設定したパラメータで確認しています。defaultではemailで確認します。
つまり、
## nameで本人認証します
config.authentication_keys = [:name]
## emailで本人認証します(default)
# config.authentication_keys = [:email]
## or
config.authentication_keys = [:email]
## ageで本人認証します
config.authentication_keys = [:age]
sign_upの時は関係ない?!
config.authentication_keysは認証用のキーですので、sign_upの時には何も影響しないのです。
確かに、登録時に認証って意味わからんわな(2段階認証とかを除いて)
つまり、
# donot_exist_columnは存在しないカラムです
config.authentication_keys = [:donot_exist_column]
これでも登録できます。sign_inはできませんが。。
sign_inの時は関係あり!!!
sign_upの時は使いませんが、sign_inと時は「本当にあなたですか」と聞くため使用します。
そのため、
# nameカラムで認証を行う。
# 他の要素(age, email)をsign_in入力しても認証では使用しない
config.authentication_keys = [:name]
このように書けばnameのみを使って本人認証している状況です。年齢や電話番号でも本人認証をしたければ後ろに追記します。[:name, :age, :number]
のように。。
devise_parameter_sanitizer.permitは認証とは関係ない?!
config.authentication_keysは認証用でしたが、devise_parameter_sanitizer.permitは何のために使うのでしょうか。
devise_parameter_sanitizer.permitはストロングパラメータなので、form等で入力された文字を取得するときに「取っていいよ」と許可を与えます。
その許可を与えたもの(パラメータ)を認証用として使って「あなたは本人ですか」と聞きます。
devise_parameter_sanitizer.permitは設定しなくてもいい?
devise_parameter_sanitizer.permitは必ずしも自ら設定する必要はありません。deviseが自動でやってくれている部分があるので、、
config.authentication_keysに登録されたパラメータに関しては自動的に「認証でこのパラメータを使うってことはストロングパラメータに設定しておいた方がいいよね!」という感じで設定されます。(優しい!そのせいで混乱しました笑)
なので、必ずしも必要ではありません。
じゃあいつ設定するのか
devise_parameter_sanitizer.permitを設定するときの状態を例を用いて説明します。
例を挙げます。
- ユーザーには名前とemailと電話番号を登録してほしい。
- でもサインイン時には名前だけでいいや
認証で使うもの
- 名前
ユーザが入力する情報 ※()はカラム名です
- 名前(name)
- email(email)
- 電話番号(number)
認証で使うものはconfig.authentication_keysに設定する必要があるので設定します。
config.authentication_keys = [:name]
次に、入力する情報はストロングパラメータに設置する必要があるので設定します。
devise_parameter_sanitizer.permit(:sign_up, keys: [:email, :number])
- sign_upだけで良い理由は、sign_inではnameだけを使用してconfig.authentication_keysに書いてあるので不要。
- config.authentication_keysに書いてあるものはすでにストロングパラメータになっているので、
keys: [:name, :email, :number]
でなくていい
=> こんな感じでdevise_parameter_sanitizer.permitは、config.authentication_keysには設定していないけど、入力として欲しいものに対して設定します。
まとめ
- config.authentication_keys・・・認証用
- devise_parameter_sanitizer.permi・・・ストロングパラメータ用
何気なく使うのはよくないですね、、
しっかりと区別しなければ、、