2017-01-03 9 views
1

私はexpressjsでcsurfモジュールを使用しています。私はそれを次のように使用するので、それはすべての投稿要求に対して機能します。expressjsでAJAXリクエスト(Jqueryなし)でcsrfトークンを送信するには?

app.use(csrf()); 
res.locals.csrfToken = req.csrfToken(); 

この方法では、次のようなすべてのフォームで自動的に利用できます。

<input type="hidden" name="_csrf" value="<%=csrfToken%>"> 

が、どのように私は、私は以下のAJAX要求を送信するためのJS関数は、jqueryのを使用していないAJAX要求のcsrftokenを設定してください。私はcsrfトークンをhtml上でgetElementByID経由でアクセスできる隠し値として利用できます。

注:csrfを無効にするとリクエストを送信できます。あなたは以下のようにデータを送信するための新しいオブジェクトを作成することができます

function voteQuestion() { 
    var qid = document.getElementById("qid").value; 
    var csrf = document.getElementById("csrf").value; 
    var http = new XMLHttpRequest(); 
    var url = "https://stackoverflow.com/q/ajaxcall"; 
    var params = "qid="+ qid; 
    http.open("POST", url); 
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    http.onreadystatechange = function() { 
    if(http.readyState == XMLHttpRequest.DONE && http.status == 200) { 
     var json = (http.responseText); 
     var obj = JSON.parse(json); 

     document.getElementById("vote-sp").innerHTML = (obj.upvotes); 
    } 
}; 
http.send(params); 

}

+0

'FormData()'オブジェクトを使用して、 'CsrfToken'で完全なフォームデータを送信できます。 –

答えて

0

私はこれを今一週間把握しようとしていますが、console.log req.sessionに決定し、クッキーに "XSRF-TOKEN"値が含まれているので、AJAXリクエストヘッダーでXSRF-TOKENをcsrfに設定しました今は動作していますが、なぜAJAXリクエストに対してこのように動作するのかはわかりません。

setRequestHeader("XSRF-TOKEN", csrf); 
0

次のようにあなたのparamsのSet crsfトークン..

var params = "qid="+ qid + "&crsf="+csrf; 

OR

..

var data = {}; //crates new object 
data.qid = qis; //adds qid to object 
data.csrf = csrf; //adds qid to object 

params = data; // to server 
+0

両方を試しても、ForbiddenError:csrfトークンが無効です。私はまた、 "&_csrf"を試しました。なぜなら、csurfは名前の値としてそれを使用していますが、まだ動作しません。また、setRequestHeader( 'X-CSRF-Token'、csrf)を試しましたが、これも機能しません。 – user856984

+0

'$ _POST ['csrf']; 'を使用してサーバファイルの値をチェックしてください。 –

+0

リクエストを送信できないため、確認できません。私はexpressを使用していて、router.post( "/ q/ajaxcall")にconsole.logを持っています。要求はその時点まで取得されません。 – user856984

関連する問題