2017-01-23 18 views
1

SPAにはVue jsを、バックエンドにはLaravelを使用しています。それはすべて正常に動作しますが、一度フォームが提出されれば明らかにcrsfトークンがリフレッシュされていないので、別のフォームを送信するとTokenMismatchExceptionと表示されます。SPAを使用したCSRFトークン

フォームがvue内のコンポーネントであるためレンダリングしようとすると、vueがエラーをスローするため、csrfトークンをフォームに挿入できません。

vueのデフォルトの共通ヘッダーを使用して、最初のリクエストでは動作しますが、現在ログインしているユーザーが最近トークンを使用したため、LaravelがTokenMismatchExceptionを返した後に、すべてのリクエストに対してname=_tokenを検索してアクセスできます。

トークンをページをリフレッシュせずにリフレッシュできるようにするには、SPAではない方法を見つけ出す必要があります。

ご協力いただければ幸いです。

ありがとうございました。 2番目の文は少しオフになっているようファンキー

+0

いいえ、それは単にcsrfトークンにアクセスする方法を示しています。私が説明したように私はそれを行うことができます。問題は、一度ログインしてしまえば、同じcsrfトークンを再び使用することはできません。リフレッシュする必要がありますが、ページが更新されずにリフレッシュできないためです。 @manniL – Jack

+0

1)https://laravel-news.com/excluding-routes-from-the-csrf-middleware 2)xhrで毎回新しいトークンを生成 –

+0

どのミドルウェアを使用していますか? – Chris

答えて

0

何かが、Vueの持ついくつかの設定おそらく、あなたのセットアップの中で起こっている:

私は名前を検索 によってVUEのデフォルト共通ヘッダを使用してCSRFトークンにアクセスすることができます= _token最初のリクエストでは動作しますが、 には、現在ログインしているユーザーが最近 トークンを使用しているため、LaravelがTokenMismatchExceptionを返した後にリクエストが発生します。

ログアウトして再度ログインしない限り、上記のようなことは起こりません。そうしないと、同じトークンを引き続き使用できます。

私は現時点でバックエンドとしてLaravelを使用していくつかのSPAを構築しています。実際の伝統的なフォームの提出は、ログインまたはログアウトシーケンス(完全なページリフレッシュ)中です。残りの時間は、同じトークンを使用するページと同じです。

1

あなたはCSRFトークン値をローカル変数を作成しますので、(あなたのメインのレイアウトブレードファイルで)のようなウィンドウに割り当てることができます。

<script> 
window.AppSettings = { 
    csrfToken: "{{ csrf_token() }}" 
} 
</script> 

は、あなたのaxios/VUE-リソース要求でそれを使用します:

axios.post("/some/path", { my: data, _token: AppSettings.csrfToken }) 
    .then(response => { 
     console.log(response.data); 
    }) 

他の回避策(すべてではお勧めしませんが)

app/Http/Middleware/VerifyCsrfToken.php

であなたのミドルウェアでそれを無効にすることです
protected $except = [ 
    "your/path/to/ignore" 
]; 

しかし、私は最初のオプションを使用します。

関連する問題