🔑
device_auth_tokenのログイン時にUnpermitted parameter: session
問題
以下の記事に倣い、device_auth_tokenを利用し、ログイン機能の実装をした。
ログイン時にUnpermitted parameter: :sessionと出た。
api_1 | Started POST "/v1/auth/sign_in" for 172.18.0.1 at 2023-01-18 16:43:55 +0900
api_1 | Processing by DeviseTokenAuth::SessionsController#create as HTML
api_1 | Parameters: {"password"=>"[FILTERED]", "email"=>"e@e.com", "session"=>{"password"=>"[FILTERED]", "email"=>"e@e.com"}}
api_1 | Unpermitted parameter: :session
api_1 | Unpermitted parameter: :session
api_1 | User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."email" = $1 AND "users"."provider" = $2 LIMIT $3 [["email", "e@e.com"], ["provider", "email"], ["LIMIT", 1]]
api_1 | Unpermitted parameter: :session
api_1 | Unpermitted parameter: :session
解決策
調べたところ、parameterがwrappingされるのが原因らしい。wrappingされること自体はrailsの通常動作であるため、wrapping自体を無効化すれば良いとのこと。以下の他の人のissueで回答されていた。https://github.com/lynndylanhurley/devise_token_auth/issues/130#issuecomment-86686367
issue内のコメント通りapi/config/initializers/wrap_parameters.rbにwrap_parameters false を追記し、解決した。
ActiveSupport.on_load(:action_controller) do
# 以下を削除あるいはコメントアウト
# wrap_parameters format: [:json] # これはデフォルトで書いてあった記述
# 以下を追加
wrap_parameters false
end
上記の修正により、送られるパラメーターは以下のように変化した。
# 修正前
Parameters: {"password"=>"[FILTERED]", "email"=>"e@e.com", "session"=>{"password"=>"[FILTERED]", "email"=>"e@e.com"}}
# 修正後
Parameters: {"password"=>"[FILTERED]", "email"=>"e@e.com"}
補足
wrap_parametersが何をしているかは、こちらのサイトの説明がわかりやすかった。具体的に興味のある人はこちらを見てみて。
Discussion