Vue路由器Laravel 5.3 Vue 2 JS上的CSRF令牌复制
所以我的问题是会话令牌是生成的 以及我通过AJAX或AXIOS发送的令牌(因为我使用vue和vue路由器获取API) 这是一个不匹配的问题 这是我在发布数据时得到的回应 ajax令牌等于主刀片模板的meta标记中的令牌 使用此标签 app.blade.php中的元标记Vue路由器Laravel 5.3 Vue 2 JS上的CSRF令牌复制,laravel,laravel-5,vue.js,vue-router,axios,Laravel,Laravel 5,Vue.js,Vue Router,Axios,所以我的问题是会话令牌是生成的 以及我通过AJAX或AXIOS发送的令牌(因为我使用vue和vue路由器获取API) 这是一个不匹配的问题 这是我在发布数据时得到的回应 ajax令牌等于主刀片模板的meta标记中的令牌 使用此标签 app.blade.php中的元标记 <meta name="csrf-token" content="{{ csrf_token() }}"> <script> window.Laravel = <?php echo json_
<meta name="csrf-token" content="{{ csrf_token() }}">
<script>
window.Laravel = <?php echo json_encode([
'csrfToken' => csrf_token(),
]); ?>
</script>
答复:
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获取的令牌为null或空
以下是来自my 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;
})
});
}
正如您所看到的,我从routes文件夹中的my 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(单页应用程序)的身份验证
而且它也给了我302状态的回复,你似乎有点误解。您已经为axios配置了csrf令牌,因此每个请求都会有一个包含令牌的头字段,然后您只需确保每个请求在到达业务逻辑之前都通过了laravel的csrf令牌验证功能,这就是防止csrf所需做的一切。在
post('/register')
之前的get('/token')
似乎没有必要
另外,谈到
/token
路由本身,csrf_字段
在这里并不合适,因为它生成了一个隐藏的表单字段(另一种发送csrf令牌的方式,不同于我们前面提到的方式)嵌入到.php
文件中,如..
=>..
,这使得通过xhr请求csrf\u字段的结果变得毫无意义。您似乎有点误解。您已经为axios配置了csrf令牌,因此每个请求都会有一个包含令牌的头字段,然后您只需确保每个请求在到达业务逻辑之前都通过了laravel的csrf令牌验证功能,这就是防止csrf所需做的一切。在post('/register')
之前的get('/token')
似乎没有必要
另外,谈到
/token
路由本身,csrf_字段
在这里并不合适,因为它生成了一个隐藏的表单字段(另一种发送csrf令牌的方式,不同于我们前面提到的方式)嵌入到.php
文件中,如..
=>..
,这使得通过xhr请求csrf\u字段的结果变得毫无意义。有人想帮忙吗?有人想帮忙吗?
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');
});