🔑

device_auth_tokenのログイン時にUnpermitted parameter: session

2023/01/18に公開

問題

以下の記事に倣い、device_auth_tokenを利用し、ログイン機能の実装をした。

https://qiita.com/15recruit15/items/9d6803ad4aa412848a4f#devise-i18n-設定

ログイン時に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が何をしているかは、こちらのサイトの説明がわかりやすかった。具体的に興味のある人はこちらを見てみて。
https://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html

Discussion