2017-01-20 67 views
0

我試圖讓我建立做了一個應用程序的驗證部分。我使用Laravel 5.3和VueJs 2作爲我的JS框架。 在我的登錄組件中,我有這方面的內容。CSRF令牌不匹配錯誤,Laravel 5.3/VueJS2

<template> 
    <form @submit="test" method="POST" action="/test"> 
     <input v-model='input' type='text'> 
     <button type='submit'>Submit</button> 
    </form> 
</template> 

<script> 
    export default { 
     data() { 
      return { 
       data: { 
        input: "hello" 
       } 
      } 
     }, 
     mounted() { 
      console.log('Component ready.') 
     }, 
     methods: { 
      test: function() { 
       this.$http.post('/test', { 
        headers: { 
         'X-CSRF-TOKEN': $('meta[name=_token]').attr('content') 
        } 
       }) 
       .then(res => { 
        console.log(res); 
       }) 
       .catch(err => { 
        console.error(err); 
       }); 
      } 
     } 
    } 
</script> 

我也有CSRF標記設置爲我的HTML文檔的頭部元數據。 <meta name="_token" content="{{ csrf_token() }}">

Laravel 5.3's Illuminate \ Foundation \ Http \ Middleware \ VerifyCsrfToken吐出錯誤,表示存在令牌不匹配。 我目前var_dump所有$請求信息傳遞到這個類'handle()函數。

public function handle($request, Closure $next) 
    { 
     var_dump($request); 
     if (
      $this->isReading($request) || 
      $this->runningUnitTests() || 
      $this->shouldPassThrough($request) || 
      $this->tokensMatch($request) 
     ) { 
      return $this->addCookieToResponse($request, $next($request)); 
     } 
     throw new TokenMismatchException; 
    } 

我沒有看到CSRF令牌與我發送的ajax請求一起傳遞。奇怪的是,如果我不使用ajax並在表單標籤內部提交諸如{{csrf_field()}}的正常表單,中間件就會成功授權令牌。這導致我相信這是我使用的ajax/vue-resource的問題。我可能做錯了什麼,但我已經搜索了關於這個問題的谷歌文章/ stackoverflow/youtube視頻,但沒有解決錯誤。我已經做了一個解決方法,我強制XSRF-TOKEN cookie與令牌進行比較,但是這讓我想到安全問題,以及當用戶在使用應用程序時意外或不知不覺地刪除了他們的Cookie時會發生什麼。不知道這是否會導致錯誤,但我已經與其他開發人員/工程師交談過,並且他們說不強制將cookie比作中間件而不是CSRF_TOKEN。

這裏有一些其他的事情我已經試過。

//I've tried the vue.http.interceptors method that comes with the bootstrap.js file Laravel generates for vue js 2. 
Vue.http.interceptors() //something along those lines 
//Setting ajax setup in bootstrap.js as wel 

$.ajaxSetup({ 
    headers: { 
     'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content') 
    } 
}); 

//I've also tried sending the token along with the vue-resource post request in the Vue component method as well. 

methods: { 
    test: function() { 
    this.$http.post('/test', {headers: 'X-CSRF-TOKEN: $('meta[name='_token']'.attr('content')} 
    ).then(response => console.log(response)); 
    } 
} 

//I've also tried using axios as my http client as well. 

任何意見或洞察,爲什麼這可能會發生以及如何解決這個問題?

回答

0

我會安裝Laravel護照(https://laravel.com/docs/5.3/passport

這實際上增加了你需要通過Vue公司在前端做認證的一切。

它還增加了OAuth的支持,您的應用意味着用戶可以生成API密鑰,並用自己的客戶端消耗你的API(你應該想這樣做)。