Ajax auth controller中的Laravel 5.2 web中间件导致csrf令牌不匹配

Ajax auth controller中的Laravel 5.2 web中间件导致csrf令牌不匹配,ajax,laravel,token,csrf,vue.js,Ajax,Laravel,Token,Csrf,Vue.js,当我像这样启用我的路由(登录、主页等)时,有人能解释我以下行为吗 但是,当我尝试以下我更喜欢使用的方法(在控制器中启用中间件)时,Ajax登录模式工作正常: class PagesController extends Controller { public function __construct() { $this->middleware('web'); } ... } class AuthController extends Contr

当我像这样启用我的路由(登录、主页等)时,有人能解释我以下行为吗

但是,当我尝试以下我更喜欢使用的方法(在控制器中启用中间件)时,Ajax登录模式工作正常:

class PagesController extends Controller
{
    public function __construct()
    {
        $this->middleware('web');
    }
    ...
}

class AuthController extends Controller
{
    public function __construct()
    {
        $this->middleware('web');
        $this->middleware('guest', ['except' => 'logout']);
    }
    ...
}
VerifyCsrfToken.php第67行中出现了一个令牌失配异常。 据我所知,这两种方法应该没有区别,我做错了什么

csrf令牌设置:

基地布局:

<meta name="csrf-token" content="{{ csrf_token() }}">

我将给您举一个工作示例,从中得出一些有助于您的想法:

app/Http/routes.php:

// all routes that start with: "/auth" are not filtered by any middleware
Route::group(['prefix' => 'auth'], function() {
    Route::get('/', ['as' => 'auth', 'uses' => 'AuthController@index']);
    Route::post('/', ['as' => 'auth.attempt', 'uses' => 'AuthController@attempt']);
    Route::delete('/', ['uses' => 'AuthController@destroy']);
    Route::any('destroy', ['as' => 'auth.destroy', 'uses' => 'AuthController@destroy']);
});

// all routes that start with: "/billing" will be handled by this group (prefix => 'billing')
// all controllers inside this route group are located in 'Billing' namespace
// all routes in this group are pre-checked by middleware 'HasAccessToBilling'
Route::group(['prefix' => 'billing', 'namespace' => 'Billing', 'middleware' => ['App\Http\Middleware\HasAccessToBilling']], function()
{
    Route::any('/', ['as' => 'billing', 'uses' => 'DashboardController@index']);

    Route::get('profile', ['as' => 'billing.profile', 'uses' => 'ProfileController@index']);

    // TARIFFS
    Route::group(['prefix' => 'tariffs'], function() {
        Route::get('/', ['as' => 'billing.tariffs', 'uses' => 'TariffsController@index']); // showing page with tariffs paginated 
        Route::get('all', ['as' => 'billing.tariffs.all', 'uses' => 'TariffsController@all']); // listing all tariffs with json (see controller)

        Route::get('create', ['as' => 'billing.tariffs.create', 'uses' => 'TariffsController@create']); // create form
        Route::post('/', ['as' => 'billing.tariffs.store', 'uses' => 'TariffsController@store']); // creating

        Route::get('{id}', ['as' => 'billing.tariffs.edit', 'uses' => 'TariffsController@edit']); // edit form
        Route::post('{id}', ['as' => 'billing.tariffs.update', 'uses' => 'TariffsController@update']); // updating

        Route::get('{id}/activate', ['as' => 'billing.tariffs.activate', 'uses' => 'TariffsController@activate']); // active = 1
        Route::get('{id}/suspend', ['as' => 'billing.tariffs.suspend', 'uses' => 'TariffsController@suspend']); // active = 0
        Route::get('{id}/delete', ['as' => 'billing.tariffs.delete', 'uses' => 'TariffsController@delete']); // deleted = 1
    });
app/Http/Middleware/HasAccessToBilling.php:

<?php namespace App\Http\Middleware;

use App\Library\Auth;
use Closure;
use Illuminate\Http\Request;

class HasAccessToBilling
{

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if (Auth::hasAccessTo('billing', $request)) {
            return $next($request);
        }
        return redirect()->route('auth');
    }
}

你能确认你没有两次运行web中间件吗?我可以确认,当我从authcontroller构造函数中删除中间件web时,它不会返回不匹配的结果,但会成功,并且不会创建任何会话。在Laravel 5.2中,
web
中间件会自动应用于
routes.php
中的所有路由,因此您不应该再次应用
web
中间件。
// all routes that start with: "/auth" are not filtered by any middleware
Route::group(['prefix' => 'auth'], function() {
    Route::get('/', ['as' => 'auth', 'uses' => 'AuthController@index']);
    Route::post('/', ['as' => 'auth.attempt', 'uses' => 'AuthController@attempt']);
    Route::delete('/', ['uses' => 'AuthController@destroy']);
    Route::any('destroy', ['as' => 'auth.destroy', 'uses' => 'AuthController@destroy']);
});

// all routes that start with: "/billing" will be handled by this group (prefix => 'billing')
// all controllers inside this route group are located in 'Billing' namespace
// all routes in this group are pre-checked by middleware 'HasAccessToBilling'
Route::group(['prefix' => 'billing', 'namespace' => 'Billing', 'middleware' => ['App\Http\Middleware\HasAccessToBilling']], function()
{
    Route::any('/', ['as' => 'billing', 'uses' => 'DashboardController@index']);

    Route::get('profile', ['as' => 'billing.profile', 'uses' => 'ProfileController@index']);

    // TARIFFS
    Route::group(['prefix' => 'tariffs'], function() {
        Route::get('/', ['as' => 'billing.tariffs', 'uses' => 'TariffsController@index']); // showing page with tariffs paginated 
        Route::get('all', ['as' => 'billing.tariffs.all', 'uses' => 'TariffsController@all']); // listing all tariffs with json (see controller)

        Route::get('create', ['as' => 'billing.tariffs.create', 'uses' => 'TariffsController@create']); // create form
        Route::post('/', ['as' => 'billing.tariffs.store', 'uses' => 'TariffsController@store']); // creating

        Route::get('{id}', ['as' => 'billing.tariffs.edit', 'uses' => 'TariffsController@edit']); // edit form
        Route::post('{id}', ['as' => 'billing.tariffs.update', 'uses' => 'TariffsController@update']); // updating

        Route::get('{id}/activate', ['as' => 'billing.tariffs.activate', 'uses' => 'TariffsController@activate']); // active = 1
        Route::get('{id}/suspend', ['as' => 'billing.tariffs.suspend', 'uses' => 'TariffsController@suspend']); // active = 0
        Route::get('{id}/delete', ['as' => 'billing.tariffs.delete', 'uses' => 'TariffsController@delete']); // deleted = 1
    });
<?php namespace App\Http\Middleware;

use App\Library\Auth;
use Closure;
use Illuminate\Http\Request;

class HasAccessToBilling
{

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if (Auth::hasAccessTo('billing', $request)) {
            return $next($request);
        }
        return redirect()->route('auth');
    }
}
<?php namespace App\Library;

use \App\Models\User;
use Illuminate\Http\Request;
use Crypt;

class Auth
{

    public static function recoverSession(Request $request)
    {
        $rememberToken = $request->cookie('remember-token', null);
        if(is_null($rememberToken)) {
            return null;
        }

        try{
            $rememberToken = Crypt::decrypt($rememberToken);
            $auth = json_decode($rememberToken, true);
            $request->session()->set('auth', $auth);
        }
        catch(\Exception $ex) {}

        return $request->session()->get('auth');
    }

    public static function hasAccessTo($realm, Request $request)
    {
        $auth = $request->session()->get('auth', null);
        if (is_null($auth)) {
            $auth = self::recoverSession($request);
        }

        return (isset($auth['access_to']))?
                in_array($realm, $auth['access_to'])
                : false;
    }
}
<?php namespace App\Http\Controllers\Billing;

use Illuminate\Http\Request;
use Redirect;
use App\Http\Controllers\Controller;
use App\Models\Tariff as Model;

class TariffsController extends Controller
{

    /**
     * Listing records
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function index()
    {
        $records = Model::paginate();
        return view('billing.tariffs.index', compact('records'));
    }

    /**
     * Listing all tariff plans as json
     * @return \Illuminate\Http\JsonResponse
     */
    public function all()
    {
        return $this->ok(Model::all());
    }