Отключите Laravel CSRF Protection для / api маршрутов при использовании API с JavaScript - PullRequest
0 голосов
/ 02 июля 2019

У меня есть бэкэнд Laravel и интерфейс React.Для разработки React работает на localhost:3000 и Laravel на localhost:8080, поэтому мне пришлось разрешить Cors.

Я успешно установил Passport и могу Использовать мой API с JavaScript ,

Но при каждом запросе я должен включать X-CSRF-TOKEN для доступа к защищенным маршрутам API, что работает, но для разработки я бы хотел отключить CSRF-Protection для API.

Я уже пытался добавить маршрут /api в массив except в VerifyCsrfToken и удалил промежуточное ПО из Kernel.php, но это, похоже, не меняет того факта, что мне все еще нужно отправить токен CSRF.

Я использую Laravel 5.8 и использую JavaScript-выборку для выполнения запросов.

VerifyCsrfToken:

protected $except = [
    '/api/*'
];```

Я закомментировал VerifyCsrfToken в ядре:

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,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

Пример маршрута API:

Route::get('test', function() {
    return response()->json(['success' => 'Hello!']);
})->middleware('auth:api');

Как я пытаюсь получить доступ к API:

const checkStatus = (response) => {
    console.log(response);
    if (response.ok) {
        return response;
    } else {
        const error = new Error(response.statusText);
        error.response = response;
        throw error;
    }
}

const parseJSON = res => res.text();

const Fetcher = {
    get: (ressource) => {
        return fetch(CONSTANTS.API_URL + ressource, {
            method: 'GET',
            mode: 'cors',
            headers: {
                'Accept': 'application/json',
                'X-Requested-With': 'XMLHttpRequest',
                //'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
            },
            credentials: 'include'
        })
            .then(checkStatus)
            .then(parseJSON)
    },
    post: (ressource, data) => {
        return fetch(CONSTANTS.API_URL + ressource, {
            method: 'POST',
            mode: 'cors',
            headers: {
                'Accept': 'application/json',
                'X-Requested-With': 'XMLHttpRequest',
                //'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
            },
            credentials: 'include',
            body: data
        })
            .then(checkStatus)
            .then(parseJSON)
    }
}

1 Ответ

0 голосов
/ 02 июля 2019

Попробуйте изолировать проблему.
Удалите auth: промежуточное ПО api в маршруте:

Route::get('api/test', function() {
    return response()->json(['success' => 'Hello!']);
});

Обратите внимание, что URL - это "api / test", а не просто "test", потому что вы определили массив $ кроме этого:

protected $except = [
    '/api/*'
];

Звоните без передачи токена CSRF.

ИЗД.

Из документации по auth: api middleware:

Laravel включает в себя охрану аутентификации, которая будет автоматически проверять токены API на входящих запросах. Вам нужно только указать auth: промежуточное ПО api на любом маршруте, для которого требуется действительный токен доступа:

это означает, что вы должны передать токен API на маршруты под промежуточным программным обеспечением auth: api, в противном случае вы получите ошибку 401.

...