InvalidAuthenticityTokenRescue

Rails 5 default protect_from_forgery is to raise an exception. Some browsers trigger this exception by caching pages. This gem rescues the InvalidAuthenticityToken exception, triggers ExceptionNotifier, and redirects to the login page. For more details and steps to reprodcue the problem see this issue: https://github.com/rails/rails/issues/21948.

With the default Rails 5 settings users receive an error page when an InvalidAuthenticityToken is raised. For actual malicious requests this would be fine. However, with the way some broswers cache pages legitimate users are getting these error pages and sometimes make repreated unsuccessful attempts to sumbmit a form.

With this gem in place when an InvalidAuthenticityToken is raised it will be rescued. The error information is captured and notifications are sent to developers. The user will be redirected to new_session_path with flash warning set to "Your session has expired, please log in again".

ExceptionNotification Gem Required

Install and congiure the exception_notifcation gem first to receive notifications when InvalidAuthenticityToken exceptions are raised.

Installation

Add this line to your application's Gemfile:

gem 'invalid_authenticity_token_rescue'

Add rescue_from_invalid_authenticity_token to your ApplicationController:

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  rescue_from_invalid_authenticity_token
  ...
end

Add skip_before_action to public forms (optional):

class SessionsController < ApplicationController
  skip_before_action :verify_authenticity_token, only: :create
  ...
end

Adding skip_before_action to public forms is optional but will improve user experience. Rails protect_from_forgery is intended to prevent a logged in user's credentials from being maliciously used to submit a form as that user. Publicly accessible forms, like a login page, that do not rely on a currently logged in user are not susceptible to forgery attacks.

Adding skip_before_action will allow the request to complete and the users session to be setup with the correct token. Subsequent forms submitted by the user will complete successfully. If skip_before_action is not added the user will be redirected to the login page and notifed that their session has expired and they need to login again.

Configuration

The default redirect_path is new_session_path. This can be set to a different value with an initializer.

# config/initializers/invalid_authenticity_token_rescue.rb
InvalidAuthenticityTokenRescue.configure do |config|
  config.redirect_path = 'sign_in_path'
end

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/wwidea/invalid_authenticity_token_rescue.

License

The gem is available as open source under the terms of the MIT License.