Задать вопрос
sharp97
@sharp97
не фонтан но брызги есть

Почему не работает путь /sanctum/csrf-cookie?

Всем привет, в общем у меня есть проект на laravel/nuxt js 3, сделал авторизацию с csrf - локально всё ок работает
api.php

Route::middleware('auth:sanctum')->group(function () {
    // Защищенные маршруты
    Route::get('/all_languages', [LanguageController::class, 'index']);
    Route::delete('/language_delete/{id}', [LanguageController::class, 'destroy']);
    Route::post('/languages_add', [LanguageController::class, 'store']);
    Route::get('/all_sections', [SectionController::class, 'index']);
    Route::delete('/section_delete/{id}', [SectionController::class, 'destroy']);
    Route::post('/section_add', [SectionController::class, 'store']);
    Route::post('/logout', [AuthController::class, 'logout']);
    Route::get('/exercises', [ExerciseController::class, 'getThemes']);
    Route::post('/exercises_create', [ExerciseController::class, 'create']);
    Route::get('/exercises_check_theme', [ExerciseController::class, 'checkIfThemeExists']);
    Route::get('/get-exercises', [ExerciseController::class, 'getExercises']);
    Route::post('/add-exercise', [ExerciseController::class, 'addExercise']);
    Route::post('/delete-exercises', [ExerciseController::class, 'deleteExercises']);
    Route::post('/delete-task-exercise', [ExerciseController::class, 'deleteTaskExercise']);
    Route::post('/upload-video', [VideoUploadController::class, 'upload']);
    Route::post('/upload-image', [ImageUploadController::class, 'upload']);
    Route::post('/upload-audio', [AudioUploadController::class, 'upload']);
    Route::put('/update-exercise', [ExerciseController::class, 'updateExercise']);

});
Route::post('register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);


AuthController.php

// Метод для авторизации
    public function login(Request $request)
    {
        $credentials = $request->only('name', 'password');
        $user = User::where('name', $credentials['name'])->first();

        if (!$user) {
            return response()->json(['message' => 'Пользователь не существует'], 404);
        }

        if (!Hash::check($credentials['password'], $user->password)) {
            return response()->json(['message' => 'Неверный пароль'], 401);
        }

        if (Auth::attempt($credentials)) {
            $user = Auth::user();

            // Создание токена
            $token = $user->createToken('authToken')->plainTextToken;

            // Разделение токена на две части
            [$id, $token] = explode('|', $token, 2);

            // Установка HttpOnly куки с токеном
            $cookie = cookie('auth_token', $token, 525600); // Установка куки на 60 минут

            // Возвращаем ответ с установленной кукой
            return response()->json([
                'message' => 'Авторизация успешна',
                'user' => $user,
            ])->withCookie($cookie);
        }

        return response()->json(['message' => 'Неверный логин или пароль'], 401);
    }


cors.php

'paths' => ['api/*', 'sanctum/csrf-cookie'],

    'allowed_methods' => ['*'],

    'allowed_origins' => ['*'],

    'allowed_origins_patterns' => [],

    'allowed_headers' => ['*'],

    'exposed_headers' => [],

    'max_age' => 0,

    'supports_credentials' => true


sanctum.php

'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
        '%s%s',
        'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
        Sanctum::currentApplicationUrlWithPort()
    ))),


utils/getBaseUrl.js

export function getBaseUrl() {
    const requestUrl = useRequestURL();
    const protocol = requestUrl.protocol; // 'http:' or'https:'
    const host = requestUrl.hostname; // 'localhost' or sharpsss.ru
    // const port = requestUrl.port ? `:${requestUrl.port}` : ''; // port

   //return `${protocol}//${host}:8000`; //localhost
return `${protocol}//${host}`; //sharpsss.ru prod
}


utils/utils.js

// utils.js
import { getBaseUrl } from "~/utils/getBaseUrl.js"

export async function fetchCsrfToken() {


    const baseUrl = getBaseUrl();

    await $fetch(`${baseUrl}/sanctum/csrf-cookie`, {
        method: 'GET',
        credentials: 'include',
    });
}


Admin.vue тут метод авторизации
async function login() {
  // const config = useRuntimeConfig();
  if (!loginData.value.name || !loginData.value.password) {
    showError.value = true;
    errorMessage.value = "Пожалуйста, заполните все поля.";
    return;
  }

  try {
    // Получение CSRF токена
    await fetchCsrfToken();
    // Отправка запроса на авторизацию
    const baseUrl = getBaseUrl();

    const response = await $fetch(`${baseUrl}/api/login`, {
      method: 'POST',
      credentials: 'include',
      headers: {
        'X-XSRF-TOKEN': decodeURIComponent(getCookie('XSRF-TOKEN')),
        'Accept': 'application/json, text/plain, */*',
        'Content-Type': 'application/json',
        'X-Requested-With': 'XMLHttpRequest',
      },
      body: loginData.value, // Теперь мы передаем объект напрямую
    });

    // Проверка успешной авторизации
    if (response && response.message === 'Авторизация успешна') {
      router.push('/content/Admin_panel');
      authStore.setAuthentication(true); // Устанавливаем аутентификацию в true
      // Установить состояние аутентификации при успешном входе
      localStorage.setItem('isAuthenticated', '1');
      // console.log("Аутентификация прошла успешно");
    }
  } catch (error) {
    if (error.response) {
      switch (error.response.status) {
        case 401:
          errorMessage.value = "Неверный пароль";
          break;
        case 404:
          errorMessage.value = "Пользователь не существует";
          break;
        default:
          errorMessage.value = "Произошла ошибка аутентификации";
      }
    } else {
      errorMessage.value = "Ошибка соединения с сервером";
    }
    showError.value = true;
  }
}

app/http/Kernel.php

protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            \Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];


заливаю на прод с такой вот конфигурацией nginx
nginx config
server {
    listen 80;
    listen [::]:80;
    server_name sharpsss.ru www.sharpsss.ru;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name sharpsss.ru www.sharpsss.ru;

    ssl_certificate /etc/letsencrypt/live/sharpsss.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/sharpsss.ru/privkey.pem; # managed by Certbot

    root /var/www/cms_prod/app_api/public;
    index index.php index.html index.htm;

    #Laravel API и Sanctum CSRF Cookie
    #  location ^~ /api/sanctum/csrf-cookie/ {
    #     try_files $uri $uri/ /index.php$is_args$args;
    # }
    location ^~ /sanctum/csrf-cookie/ {
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location ^~ /api/ {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # Обрабатывать PHP скрипты
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }

    # Все остальные запросы перенаправлять на Nuxt.js сервер
    location / {
        proxy_pass http://localhost:3000; # Используйте localhost, если Nuxt.js запущен на том же сервере
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
    # Дополнительные настройки SSL
    # ...
}
выдаёт ошибку при https://sharpsss.ru/sanctum/csrf-cookie
Request URL:
https://sharpsss.ru/sanctum/csrf-cookie
Request Method:
GET
Status Code:
404 Not Found
Remote Address:
134.0.117.3:443
Referrer Policy:
strict-origin-when-cross-origin
пробовал в .env ставить SESSION_SECURE_COOKIE=true,также пробовал prefix в api/config/sanctum.php 'prefix' => 'api/sanctum' ставить чтобы по api/santum отрабатывало (и чисто получение вроде как работало но лишь при авторизации потом все мидлвар запросы не работали)
почему то ссылку не даёт крепить
657d672d19050137831916.png
также пробовал в app.php в 'providers' добавлять Laravel\Sanctum\SanctumServiceProvider::class,не помогло, в роут листе гет вот так обозначен
GET|HEAD  sanctum/csrf-cookie .......................................................... sanctum.csrf-cookie › Laravel\Sanctum › CsrfCookieController@show
  • Вопрос задан
  • 513 просмотров
Подписаться 1 Сложный 34 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы