Vue/Laravel — несоответствие токена CSRFJavascript

Форум по Javascript
Ответить
Anonymous
 Vue/Laravel — несоответствие токена CSRF

Сообщение Anonymous »

В среде на основе Vue-Laravel токен CSRF инициализируется на стороне сервера (не Sanctum, один токен на каждый запуск):

routes/web.php

Код: Выделить всё

Route::get('csrf-token' , function(){
$token = csrf_token();
return response()->json(['token' => $token])->cookie('XSRF-TOKEN'$token,0,'/',null,false,false, false, 'lax');
});
CSRF-token-request исключен из промежуточного программного обеспечения проверки токена:

middleware/verifyCsrfToken.php

Код: Выделить всё

protected $except = [
'csrf-token',
'api/*'
];
Токен проверяется при каждом запросе, отправленном на сервер:

middleware/verifyCsrfToken.php

Код: Выделить всё

protected function tokenmatches($request) : bool{
$csrftoken = $request->session()->token();

if (! is_string($csrftoken)) {
return false;
}

// Accept token via header(s)
$header1 = $request->header('X-CSRF-TOKEN');
$header2 = $request->header('X-XSRF-TOKEN');

if (is_string($header1) && hash_equals($csrftoken, $header1)) {
return true;
}
if (is_string($header2) && hash_equals($csrftoken, $header2)) {
return true;
}

// Accept token from cookie (frontend frameworks often store token in XSRF-TOKEN cookie)
$cookie = $request->cookie('XSRF-TOKEN');
if (is_string($cookie)) {
$cookie = rawurldecode($cookie);
if (hash_equals($csrftoken, $cookie)) {
return true;
}
}

return false;
}
public function handle(Request $request, Closure $next): Response
{
// Respect excluded paths
foreach ($this->except as $except) {
if ($request->is($except)) {
return $next($request);
}
}

if ($this->tokenmatches($request)) {
return $next($request);
}

abort(419, 'CSRF token mismatch.');
}
Конфигурация сеанса:

.env

Код: Выделить всё

SESSION_DRIVER=database         # file, cookie, database, redis, memcached, array
SESSION_ENCRYPT=false
SESSION_PATH=/ # cookie path
SESSION_LIFETIME=120       # minutes
SESSION_EXPIRY_ON_CLOSE=false   # true/false (expire on browser close)
SESSION_SECURE_COOKIE= false     # true in prod with HTTPS, false on local HTTP
SESSION_HTTP_ONLY=false        # true: JS can't read cookie
SESSION_SAME_SITE= lax         # lax | strict | none  (note: none requires secure=true)
SESSION_DOMAIN=null             # e.g.  .example.com or null (for localhost)
SESSION_COOKIE=laravel_session  # cookie name
config/session.php

Код: Выделить всё

return [

'driver' => env('SESSION_DRIVER', 'database'),
'lifetime' => (int) env('SESSION_LIFETIME', 120),
'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
'encrypt' => env('SESSION_ENCRYPT', false),
'files' => storage_path('framework/sessions'),
'table' => env('SESSION_TABLE', 'sessions'),
'store' => env('SESSION_STORE'),
'lottery' => [2, 100],
'cookie' => env(
'SESSION_COOKIE',
Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
),
'path' => env('SESSION_PATH', '/'),
'domain' => env('SESSION_DOMAIN' , null),
'secure' => env('SESSION_SECURE_COOKIE' , false),
'http_only' => env('SESSION_HTTP_ONLY', false),
'same_site' => env('SESSION_SAME_SITE', 'lax'),
'partitioned' => env('SESSION_PARTITIONED_COOKIE', false),

];
Клиентская сторона:
*прокси-сервер применяется к //vite.config.js
*используется запрос axios - запрос axios, настроенный вручную в //globalStore/sharedStore.js-
конфигурация axios:

globalStore/sharedStore.js

Код: Выделить всё

axios.defaults.baseURL = 'http://localhost:8000';
axios.defaults.withCredentials = true; // send cookies
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
axios.defaults.headers.common['Accept'] = 'application/json';
axios.defaults.headers.post['Content-Type'] = 'application/json';
axios.defaults.withCredentials = true; // important if using Sanctum or cookie-based auth
axios.defaults.timeout = 10000
Запрос токена CSRF:

globalStore/sharedStore.js

Код: Выделить всё

async function csrftoken() {
try {
const { data: token } = await axios.get('csrf-token');
axios.defaults.headers.common['X-CSRF-TOKEN'] = token.token;
}catch(error)
.............
Файл cookie запроса не формируется, токен генерируется повторно при каждом запросе, при вызове запроса PUT, POST, PATCH возникает несоответствие токена CSRF.>

Подробнее здесь: https://stackoverflow.com/questions/798 ... n-mismatch
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»