cookie_based_csrf.rb 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. # frozen_string_literal: true
  2. module CookieBasedCsrf
  3. extend ActiveSupport::Concern
  4. included do
  5. after_action :delete_session_cookie
  6. after_action :set_csrf_token
  7. def delete_session_cookie
  8. cookies.delete(Rails.application.config.session_options[:key])
  9. end
  10. def set_csrf_token
  11. # If no JWT, reset CSRF tokens
  12. unless cookies[:jwt]
  13. cookies.delete(:_csrf_token)
  14. cookies.delete('x-csrf-token')
  15. return
  16. end
  17. cookies['x-csrf-token'] = {
  18. value: form_authenticity_token,
  19. httponly: false,
  20. secure: !(Rails.env.development? || Rails.env.test?),
  21. }
  22. end
  23. def real_csrf_token(_session)
  24. cookies.encrypted[:_csrf_token] ||= {
  25. value: SecureRandom.base64(
  26. ActionController::RequestForgeryProtection::AUTHENTICITY_TOKEN_LENGTH,
  27. ),
  28. httponly: true,
  29. secure: !(Rails.env.development? || Rails.env.test?),
  30. }
  31. Base64.strict_decode64(cookies.encrypted[:_csrf_token])
  32. end
  33. end
  34. end