2017-05-01 29 views
1

他の質問/回答に掲載されているcsrf_token()が必要ですが、外部サーバーからトークンを取得できない場合はどうなりますか?TokenMismatchException Laravelお問い合わせフォーム

初めてLaravelに何かを構築します。私はそれに精通するために単純なAjax連絡フォームを作成しています。

ここでここで(web.phpである)私のルート

がある私のJS(Iだけではなく、まっすぐにそれをシリアル化の個々の値を必要とするので、いくつかのクライアント側の処理があるでしょう)

$('#contact-form').on('submit', function(e){ 

    e.preventDefault(); 

    $.ajax({ 
     type: 'POST', 
     url: 'forms/contact.php', 
     dataType: "json", 
     data: { 

      name: encodeURIComponent($("#contact-name").val()), 
      email: encodeURIComponent($("#contact-email").val()), 
      phone: encodeURIComponent($("#contact-phone").val()), 
      subject: encodeURIComponent($("#contact-subject").val()), 
      message: encodeURIComponent($("#contact-message").val()) 


     }, 
     success: function(data) { 

      alert(data.message); 

     } 

    }); 

}); 

です

Route::post('forms/contact.php', '[email protected]'); 

そして、ここには私の連絡先コントローラの主な公共機能は

public function send(Request $request){ 

    return response()->json([ 
     'result' => true, 
     'message' => 'success' 
    ]); 
} 

「送信」であります今の主な目標は、フォームに正常なメッセージを戻すことだけです。

...誰かがこのような形式を使ってフォームに検証を戻す方法を知っていますか?私はスーパーのnoobだ

+0

可能な重複http://stackoverflow.com/questions/32738763/laravel-csrf -token-mismatch-for-ajax-post-request) – aynber

+0

投稿要求にcsrf_tokenを渡す必要があります。 – aynber

答えて

3

Laravelはセッションに保存されているPOSTの呼び出しへの鍵に沿って通過する必要がありますCRSFトークンを持っているので、私は謝罪

$this->validate($request, [ 
     'name' => 'required', 
     'email' => 'required|email', 
     'message' => 'required' 
    ]); 

は、私は昨日Laravelを拾いました。このトークンが一致しない場合、または存在しない場合、要求を拒否します。あなたは、修正方法このhere

詳細を読むことができます:(webミドルウェアを使用した場合)

 name: encodeURIComponent($("#contact-name").val()), 
     email: encodeURIComponent($("#contact-email").val()), 
     phone: encodeURIComponent($("#contact-phone").val()), 
     subject: encodeURIComponent($("#contact-subject").val()), 
     message: encodeURIComponent($("#contact-message").val()), 
     _token: "{{ csrf_token() }}" 
+0

私はAPIを1つのサーバー上のLaravel上に構築していて、別のサーバーからそのAPIを呼びたいと思っていましたが、どうすればそのcsrf_tokenを入手できますか?認証されたエンドポイントを使用するのは理にかなっていますか? – user2287474

+2

代わりにAPI認証を使用する必要があります。 –

+1

https://laracasts.com/discuss/channels/general-discussion/l5-avoiding-csrf-ミドルウェア-on-api-post-routes?page=1 –

2

デフォルトでは、LaravelはあなたがCSRF攻撃をagains保護します。

がここでそれについて続きを読む:https://laravel.com/docs/5.4/csrf

単純なアプローチを、JavaScriptコードでトークンを取得し、グローバル変数に格納し、その後、あなたのページに出力するようにCSRFトークンです。メールのhtmlページテンプレートで

<script> 
    window.Laravel = <?php echo json_encode([ 
     'csrfToken' => csrf_token(), 
    ]); ?> 
</script> 

次に、ヘッダ値X-CSRF-TOKENに、入れてパッチを要求、任意のポストにそれを送ります。例えば

、jQueryのAJAXを使用してあなたのポストの呼び出しで:

$('#contact-form').on('submit', function(e){ 

    e.preventDefault(); 

    $.ajax({ 
     type: 'POST', 
     beforeSend: function(request) { 
      request.setRequestHeader("X-CSRF-TOKEN", Laravel.csrfToken); 
     }, 
     url: 'forms/contact.php', 
     dataType: "json", 
     data: { 

      name: encodeURIComponent($("#contact-name").val()), 
      email: encodeURIComponent($("#contact-email").val()), 
      phone: encodeURIComponent($("#contact-phone").val()), 
      subject: encodeURIComponent($("#contact-subject").val()), 
      message: encodeURIComponent($("#contact-message").val()) 


     }, 
     success: function(data) { 

      alert(data.message); 

     } 

    }); 
}); 
[AjaxのPOSTリクエストのためLaravel CSRFトークンの不一致](の
関連する問題