Rails, Devise authentication, CSRF issue

前端 未结 10 1144
不思量自难忘°
不思量自难忘° 2020-11-28 20:52

I\'m doing a singe-page application using Rails. When signing in and out Devise controllers are invoked using ajax. The problem I\'m getting is that when I 1) sign in 2) sig

10条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-28 21:35

    This is my take:

    class SessionsController < Devise::SessionsController
      after_filter :set_csrf_headers, only: [:create, :destroy]
      respond_to :json
    
      protected
      def set_csrf_headers
        if request.xhr?
          response.headers['X-CSRF-Param'] = request_forgery_protection_token
          response.headers['X-CSRF-Token'] = form_authenticity_token
        end
      end
    end
    

    And on the client side:

    $(document).ajaxComplete(function(event, xhr, settings) {
      var csrf_param = xhr.getResponseHeader('X-CSRF-Param');
      var csrf_token = xhr.getResponseHeader('X-CSRF-Token');
    
      if (csrf_param) {
        $('meta[name="csrf-param"]').attr('content', csrf_param);
      }
      if (csrf_token) {
        $('meta[name="csrf-token"]').attr('content', csrf_token);
      }
    });
    

    Which will keep your CSRF meta tags updated every time you return X-CSRF-Token or X-CSRF-Param header via ajax request.

提交回复
热议问题