2017-01-20 15 views
0

Я пытаюсь получить часть приложения Auth, которую я создаю. Я использую 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_dumping из всей информации запроса $, которая передается в этот класс '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-ресурсом, который я использую. Возможно, я что-то делаю неправильно, но я просмотрел видео в google posts/stackoverflow/youtube по этой проблеме, но ничего не исправила ошибку. Я проделал обходной путь, когда я заставляю файл cookie XSRF-TOKEN сравниваться с токеном, но это заставляет задуматься о проблемах безопасности и о том, что происходит, когда пользователь случайно или неосознанно удаляет свои файлы 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 (если вы хотите это сделать).