2017-06-08 9 views
-1

私は、フォームの提出を希望するCDNレベルでキャッシュされたページを持っています。非同期にレール認証トークンを設定します

私は非同期にCSRFのメタタグを取得し、フォームで渡ってそれらを送信するためにtechnique 3 of this post続いてきたが、私はこれをしようとすると、私はフォーム送信コントローラのアクションにActionController::InvalidAuthenticityTokenを取得しています。すべてがうまくいくようですが、フォームはまだ拒否されています。

def csrf_meta 
    respond_to do |format| 
    format.json do 
     render json: { 
     param: request_forgery_protection_token, 
     token: form_authenticity_token 
     } 
    end 
    end 
end 

そして、ここでここで<head>

function asyncCsrf() { 
    window.fetch("/async_info/csrf_meta") 
    .then(function(response) { 
    response.json().then(function(json) { 
     console.log(json); 
     var meta = document.createElement('meta'); 
     meta.name = "csrf-param"; 
     meta.content = json.param; 
     document.getElementsByTagName('head')[0].appendChild(meta); 
     var meta = document.createElement('meta'); 
     meta.name = "csrf-token"; 
     meta.content = json.token; 
     document.getElementsByTagName('head')[0].appendChild(meta); 
    }); 
    }).catch(function(err) { 
    console.log(err); 
    }); 
} 

にそれを追加するJS関数は、フォームに真正トークンを追加するJSです:ここで

は、CSRFの情報を提供する行為があります

var authToken = document.querySelector("meta[name='csrf-token']").getAttribute("content"); 
// later: 
<input type="hidden" name="authenticity_token" value="'+authToken+'"> 

すべてが存在するようです。トークンはフォームと共に渡されますが、それにもかかわらずActionController::InvalidAuthenticityTokenが残ります。

+0

リンクする代わりに、使用しているコードを表示できますか? –

+0

@maxpleanerええ。コードを追加しました。私のコードは、jQueryの代わりにバニラjsを除くリンクされたものとほとんど同じです。 – spitfire109

答えて

0

私は問題を解決しました:何らかの理由でfetch() APIが間違ったセッションを返していました。良い古き良きXMLHttpRequest()作品です。私は、ヘッダがfetchコールに自動的に含まれていないかもしれないが、XMLHttpRequestである可能性があります。私が一度これを挫折させたら、私は独立して調査します。

関連する問題