cookie_based_csrf.rb 994 B

12345678910111213141516171819202122232425262728293031323334353637383940
  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. unless cookies[:jwt]
  12. cookies.delete(:_csrf_token)
  13. cookies.delete('x-csrf-token')
  14. return
  15. end
  16. cookies['x-csrf-token'] = {
  17. value: form_authenticity_token,
  18. httponly: false,
  19. secure: !(Rails.env.development? || Rails.env.test?),
  20. }
  21. end
  22. def real_csrf_token(_session)
  23. cookies.encrypted[:_csrf_token] ||= {
  24. value: SecureRandom.base64(
  25. ActionController::RequestForgeryProtection::AUTHENTICITY_TOKEN_LENGTH,
  26. ),
  27. httponly: true,
  28. secure: !(Rails.env.development? || Rails.env.test?),
  29. }
  30. Base64.strict_decode64(cookies.encrypted[:_csrf_token])
  31. end
  32. end
  33. end