2017-06-05 3 views
1

私はActionController :: InvalidAuthenticityTokenは単純なリソースを節約取得しています。..Railsの5 InvalidAuthenticityTokenが、トークンが存在する

CSRFのメタタグが存在している:

<meta name="csrf-token" content="Z4fDRsIqCp4cvpCw1Dp6kN7z0uPNF5otp611C80YhUg/oB+AcUy+dz2b5qKyoMMo48LdEvbF3dcBn2d0GqeR+g==" /> 

、フォームのトークン・フィールド:

<input type="hidden" name="authenticity_token" value="bIMZ5cndd/CTgOwjC3quOp02WlvWdDmhdNQCyKb920HIZz2Y8vvNDlTa7d4PKaJ5pUY6QkHKYCqiHikc2rFsyQ==" /> 

セッションIDはリクエスト間で維持されませんが、この動作はCSRFエラーが発生した場合のものであることを理解しています。

フォームのコード:コントローラの関連する

<%= form_for document do |f| %> 
    <% if document.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(document.errors.count, "error") %> prohibited this document from being saved:</h2> 

     <ul> 
     <% document.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

アクション:

def new 
    @document = Document.new 
    end 

    def create 
    @document = Document.new(document_params) 

    respond_to do |format| 
     if @document.save 
     format.html { redirect_to @document, notice: 'Document was successfully created.' } 
     format.json { render :show, status: :created, location: @document } 
     else 
     format.html { render :new } 
     format.json { render json: @document.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

も、このトラブルシューティングを行う、と明白な理由のために、私はCSRFの電源を切ることを望んでいないよする方法がわかりません保護。

編集:私はプロキシとしてnginxのコンテナを経由していますが、おそらく私の設定が間違っていますか?ここではその設定は次のとおりです。

upstream backend { 
    server service:3000; 
} 

server { 
    listen 80 default_server; 

    error_page 500 502 503 504 /500.html; 
    error_log /dev/stdout info; 
    access_log /dev/stdout; 

    location/{ 
     proxy_pass http://backend; 
    } 
} 
+0

あなたはdeviseを使用していますか? – Gerry

+0

いいえ、追加の宝石をまだ追加していません – user1456632

+0

私の質問を潜在的に関連性のある情報で更新しました – user1456632

答えて

1

誰がnginxのプロキシの背後本に実行されているため、これはhere概説としてnginxのためにプロキシ設定を追加することで解決されています

私はこれらを行方不明になった:

proxy_set_header  X-Real_IP  $remote_addr; 
proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
proxy_set_header  X-NginX-Proxy true; 
proxy_set_header  Host   $http_host; 
proxy_set_header  Upgrade   $http_upgrade; 
proxy_pass_header  Set-Cookie; 
1

私はこの問題を数日間解決しましたが、最終的には、nginxの設定でこの欠落した行がつまずくようになりました。

「proxy_set_header X-Forwarded-Proto https;」行を追加すると、すべてのCSRFトークンエラーが終了します。

関連する問題