2016-11-16 174 views
1

所以我的問題是生成會話令牌。Vue路由器上的CSRF令牌複製Laravel 5.3 Vue 2 JS

而且我已經通過AJAX或AXIOS(原因IM使用VUE和VUE路由器獲取API)發送

令牌越來越不匹配

這是發佈數據

當我得到的迴應

AJAX的令牌使用該標籤

元T等於在主葉片模板

的元標記令牌AG在app.blade.php

<meta name="csrf-token" content="{{ csrf_token() }}"> 
<script> 
    window.Laravel = <?php echo json_encode([ 
     'csrfToken' => csrf_token(), 
    ]); ?> 
</script> 

Axios公司的攔截器(目的是從所述元標籤注入csrf_token)

Vue.axios.interceptors.request.use(function (config) { 

    config.headers['X-CSRF-TOKEN'] = Laravel.csrfToken; 
    console.log(config); 
    return config; 
    }, function (error) { 
    // Do something with request error 
    return Promise.reject(error); 
}); 

響應:

array:1 [ 
    "SessionToken" => "JfhmtCaTiQ49BtF2VK3TysvYnEQSE9n5i1uiHegO" 
] 
array:1 [ 
    "AjaxToken" => "WqKOiaunbvJbxIsnEjetFoCm1mvdUYESRqfXO2lv" 
] 

VerifyCSRFToken中間件方法:

protected function tokensMatch($request) 
    { 
     $sessionToken = $request->session()->token(); 

     $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN'); 

     dd(['SessionToken' => $sessionToken],['AjaxToken' => $token]); 
     if (! $token && $header = $request->header('X-XSRF-TOKEN')) { 
      $token = $this->encrypter->decrypt($header); 
     } 

     if (! is_string($sessionToken) || ! is_string($token)) { 
      return false; 
     } 

     return hash_equals($sessionToken, $token); 
    } 

所以我想出了這個主意,但它不工作,因爲它,即時通訊從API獲得令牌爲空或空

這裏是我的RegisterComponent.vue

submitForm() { 
     this.axios.get('/token') 
      .then(response => { 
       this._token = response.data 
        this.axios.post('/register',this.data) 
         .then(responseNew => { 
          console.log(responseNew.data); 
         }) 
         .catch(responseNew => { 
          this.errors = responseNew.data; 
         }) 
      }); 
    } 

的方法,你可以看到IM在路由文件夾

,並即時得到令牌從我api.php也使用Laravel的驗證API,並把它的API路線太

這裏是api.php

Route::group(['middleware' => 'web'], function() { 
    Auth::routes(); 
}); 

Route::get('/token',function() { 
    dd(csrf_field()); 
}); 
Route::get('/user', function (Request $request) { 
    return $request->user(); 
})->middleware('auth:api'); 

Route::resource('/users','UserController'); 

Route::group(['middleware' => 'auth'], function() { 


Route::resource('/stores','StoreController'); 

Route::resource('/items','ItemController'); 

Route::resource('/transactions','StoreController'); 

Route::resource('/managers','ManagerController'); 

Route::resource('/employees','EmployeeController'); 

Route::resource('/customers','CustomerController'); 

Route::resource('/tags','TagController'); 

}); 

那麼如何防止它產生會導致不匹配的令牌?

任何人回答這個問題一定會幫助我的SPA(單頁APP)

和認證的也給我響應狀態302

+0

任何人都想幫忙嗎? –

回答

0

你似乎有一點誤解。您爲axios配置了csrf標記,因此每個請求都會有一個包含標記的標題字段,那麼您只需確保每個請求都在laravel的csrf標記驗證函數達到您的業務邏輯之前通過,這就是您需要做的防止csrf。 post('/register')之前的get('/token')似乎沒有必要。

而且,在談論/token路由本身,csrf_field是不恰當的在這裏,因爲它會生成一個隱藏的表單字段(另一種方式來從我們前面談到的發送CSRF令牌分開)被嵌入在.php文件中像<form>...<?=csrf_field()?>...</form> =><form>...<input type="hidden" name="laravel_csrf_token" value="***">...</form>,這使得通過xhr請求csrf_field的結果變得毫無意義。