Vue路由器Laravel 5.3 Vue 2 JS上的CSRF令牌复制

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_

所以我的问题是会话令牌是生成的

以及我通过AJAX或AXIOS发送的令牌(因为我使用vue和vue路由器获取API)

这是一个不匹配的问题

这是我在发布数据时得到的回应

ajax令牌等于主刀片模板的meta标记中的令牌

使用此标签

app.blade.php中的元标记

<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');

});