概要
POSTリクエストがすべて422が返ってきてしまいます。以前までCloudFrontを前段に挟んでおらず、POSTが通っていたのですが、CloudFrontを前段に挟んで以降、後述のエラーが表示されるようになってしまいました。
環境
- Rails + puma
- nginx:リバースプロキシとして利用
- Cloud Front:静的アセットのキャッシュとして利用
構成は、下記となっております。
user <=> CloudFront <=> nginx <=> Rails + puma
Cloudfrontのドメイン:test.com
Originのドメイン:origin-test.com
エラー内容
[2019-12-30T07:23:04.119158 #1] WARN -- : [c35e0626-b87c-4576-a2c2-88de297d500f] Can't verify CSRF token authenticity. I, [2019-12-30T07:23:04.119403 #1] INFO -- : [c35e0626-b87c-4576-a2c2-88de297d500f] Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms) F, [2019-12-30T07:23:04.120488 #1] FATAL -- : [c35e0626-b87c-4576-a2c2-88de297d500f] F, [2019-12-30T07:23:04.120523 #1] FATAL -- : [c35e0626-b87c-4576-a2c2-88de297d500f] ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken): F, [2019-12-30T07:23:04.120558 #1] FATAL -- : [c35e0626-b87c-4576-a2c2-88de297d500f] F, [2019-12-30T07:23:04.120628 #1] FATAL -- : [c35e0626-b87c-4576-a2c2-88de297d500f] actionpack (5.2.1) lib/action_controller/metal/request_forgery_protection.rb:211:in `handle_unverified_request'
※また、Rails5からデフォルトでtrueとなったforgery_protection_origin_check
のフラグはfalseに変更しております。本来であればtrueのまま回避したいのですが、cloudfrontとoriginのドメインが異なるものになるのは避けられず、、(リバースプロキシ使うやり方等良い方法があれば教えて下さい..
Rails.application.config.action_controller.forgery_protection_origin_check = false
試したこと
- nginx.confファイルにリクエストヘッダをスルーするよう追記
location / { proxy_pass http://app; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-CSRF-Token $http_x_csrf_token; }
- cloud frontのBehavior設定にて、Headersのwhitelistを追加してパススルー
何卒、よろしくお願いいたします。
参考
RailsのPOSTでCSRF TokenがVerifyできないときに確認したいこと
https://qiita.com/yu_suke1994/items/39fa64ef96aa2a67dc2a
NginxをReverseProxyにしてRailsアプリをデプロイしたらはまった
https://qiita.com/incog_neet/items/aea655f927da2063512d
RailsのPOSTでCSRF TokenがVerifyできないときに確認したいこと
https://qiita.com/yu_suke1994/items/39fa64ef96aa2a67dc2a
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。