реагировать на ошибку несоответствия токена laravel csrf не работает даже после попытки партии

Я пробовал следующие вещи. но все же проблема csrf сохраняется при отправке почтового запроса от реакции на laravel

Я использовал cors промежуточного программного обеспечения barryvh для исправления проблемы cors

в cors.php

'supportsCredentials' => false,
   'allowedOrigins' => ['*'],
   'allowedHeaders' => ['Content-Type', 'X-Requested-With','token','user_token','_token','X-CSRF-TOKEN'],
   'allowedMethods' => ['*'], // ex: ['GET', 'POST', 'PUT',  'DELETE']
   'exposedHeaders' => [],
   'maxAge' => 0,
  1. метатеги на странице

       return (
          <div className="Login" style={{fontFamily: 'Montserrat, sans-serif',height:'36em'}}>
            <input type="hidden" name="_token" value="{{ csrf_token() }}"></input>
            <meta name="csrf-token" content="{{ csrf_token() }}"/>
            {/* { csrf_token() } */}
            {/* { @csrf } */}
            {/* { csrf_field() }*/}
    
  2. метатег в корне (index.html)

  3. tried following commented code in post

      return fetch("www.campaignserver.com:3001/test", 
            {
                method: 'post',
                credentials: "same-origin",
                headers: {
                        'Accept': 'application/json',
                        'Content-Type': 'application/json',
                        //"_token": "{{ csrf_token() }}",
                        "X-Requested-With": "XMLHttpRequest",
                        'X-CSRF-TOKEN': document.querySelector("[name~=csrf-token] 
               [content]").content
                    },
    
  4. сторона laravel - route.api.php

       // Route::middleware('auth:api')->post('/test', function (Request $request) {
       //     return response()->json(['message' =>'corstest'], 200);
       // });
       // Route::post('test', 'HomeController@test');
      // Route::get('test', 'HomeController@test');
    

как я могу определить основную причину? пожалуйста, предложите


person Neeraj Verma    schedule 18.11.2019    source источник


Ответы (1)


Поскольку вы используете laravel в качестве api, использование токена CSRF не имеет смысла.

По умолчанию, когда вы используете файл маршрута routes/api.php, проверка токена CSRF не выполняется. Вы можете проверить это в app/Http/Kernel.php:

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class, //<-- HERE IS THE CSRF VERIFICATION
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [ //<--- AS you can see there is no VerifyCsrfToken middleware in API
        \Barryvdh\Cors\HandleCors::class,
        'throttle:300,1', 
        'bindings',
    ],
];

Для маршрута, который вы вызываете, маршруты, объявленные в routes/api.php, по умолчанию имеют префикс, вы можете проверить это в app\Providers\RouteServiceProvider.php @ mapApiRoutes:

/**
 * Define the "api" routes for the application.
 *
 * These routes are typically stateless.
 *
 * @return void
 */
protected function mapApiRoutes()
{
    Route::prefix('api') //<-- here is the prefix
         ->middleware('api') //<-- this is the kernel middleware used for this route group
         ->namespace($this->namespace)
         ->group(base_path('routes/api.php')); //<-- and here is the related file
}
person N69S    schedule 18.11.2019
comment
веб-массив уже содержит csrf, в массиве api я добавил то, что вы сказали, stll такая же проблема. Я также попытался удалить параметр токена в массиве заголовков, все еще проблема - sam, с или без - person Neeraj Verma; 18.11.2019
comment
@NeerajVerma - маршрут POST, который вы используете, находится в api.php файле маршрута? - person N69S; 18.11.2019
comment
ваш базовый URL в Const.URL.SERVER_BASE_URL + "/test" равен domain.com/api? или только домен? - person N69S; 18.11.2019
comment
только домен .. полный URL: www.campaignserver.com:3001 - person Neeraj Verma; 18.11.2019
comment
по умолчанию все маршруты, объявленные в routes/api.php, имеют префикс api, поэтому вам следует вызвать domain.com/api/test - person N69S; 18.11.2019
comment
мне также нужно объявить собственный маршрут в route.api - person Neeraj Verma; 18.11.2019
comment
Позвольте нам продолжить это обсуждение в чате. - person Neeraj Verma; 18.11.2019
comment
Я попытался получить ответ (api.campaignserver.com:3001/test, {, ... все еще та же проблема - person Neeraj Verma; 18.11.2019