【Rails】Deviseのsign_inをpostリクエストで実行するとunpermittedエラーが出る問題

【Rails】Deviseのsing_inを postリクエストで実行すると unpermittedエラーが出る問題

こんにちは、えびじゅん(@ebijun1007)です。

Web系企業でエンジニアをしています。

 

現在、大学時代の友人と一緒に、勉強がてらWebアプリを作っています。

 

フロントエンドがReact、バックエンドがRailsという構成です。

もちろんインフラにはDockerを使用しています。

 

アプリの内容は簡単なタスク管理アプリで

  • ユーザ
  • ユーザごとのタスク

の2種類のアセットを管理するものになります。

ユーザ管理には定番のDeviseジェムを使用していますが、APIモードでRailsを構築した場合の記事があまりなく結構手強いです。

 

今回はDeviseで作られたログイン用のpathにpostリクエストを投げた時にバグが発生したので、解決策を共有したいと思います。

 

 

Unpermitted parameters: :session

ストロングパラメータの問題です。

外部からPostされた際に、セキュリティの都合から、Controllerで明示的に許可した値以外は受け付けない仕組みになっています。

パラメータを許可するためには

ApplicationControllerでdevise_parameter_sanitizerメソッドを使用します。

class ApplicationController < ActionController::API
        include DeviseTokenAuth::Concerns::SetUserByToken
        before_action :skip_session
        before_action :configure_permitted_parameters

  protected
    def skip_session
      request.session_options[:skip] = true
    end

    def configure_permitted_parameters
      # devise_parameter_sanitizer.permit(許可したいアクション, keys: [許可したいパラメータ])
      devise_parameter_sanitizer.permit(:sign_up, keys: [:email, :password])
      devise_parameter_sanitizer.permit(:sign_in, keys: [:email, :password, :format])
    end

end

 

Unpermitted parameters: :sessionが解決できない。。。

上記対策で許可するパラメータを追加しても、sessionだけ解決できないという問題が発生しました。

このsessionですが、クライアント側からpostしたパラメータではなく、devise側で勝手に作るパラメータのようです。

 

この問題を解決するためには

rails-app/config/initializers/wrap_parameters.rb
 
をイジる必要があります
 
 
ActiveSupport.on_load(:action_controller) do
  wrap_parameters format: [:json]
end

この部分を探して、format: [:json]の中身を空っぽにします。

アフター;

ActiveSupport.on_load(:action_controller) do
 wrap_parameters format: []
end

 

これで解決できます。

 

Railsはジェムが豊富ですし、複雑なコードを書かなくてもよくある処理を実装できますが

勝手にやってくれる分、エラーが起きた時の対応がめんどくさいですね😓

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください