Как правильно настроить аутентификацию для проекта на Laravel и Vue, если они работают на разных доменах?

Я следовал инструкции из статьи: <br/> <a href="https://codecourse.com/articles/the-complete-guide-to-authenticating-with-laravel-sanctum-in-vue" rel="nofollow">https://codecourse.com/articles/the-complete-guide...</a>, и у меня все работает с одинаковыми доменами, но разными портами. Для этого пришлось добавить путь в cors.php = '/', иначе возникали проблемы с preflight-запросами при нажатии кнопки login. <br/> Бэк: <a href="http://laravel-sanctum-vue.test" rel="nofollow">laravel-sanctum-vue.test</a> <br/> Фронт: <a href="http://laravel-sanctum-vue.test:5173" rel="nofollow">laravel-sanctum-vue.test:5173</a> <br/> <br/> Теперь я хочу настроить систему для работы с разными доменами. <br/> Бэк: <a href="http://laravel-sanctum-vue.test" rel="nofollow">laravel-sanctum-vue.test</a> (так же как и раньше: протокол + домен + порт) <br/> Фронт: <a href="http://changed-sanctum-vue.test:5173" rel="nofollow">changed-sanctum-vue.test:5173</a> (изменился только домен) <br/> <br/> Это может быть полезно для подключения к существующему и опубликованному на VPS бэкенду с локального устройства, используя localhost или <a>https://local.{prod_domain}.test:5173</a>, добавленный в файл hosts в Windows. <br/> <br/> Однако я столкнулся с проблемами, связанными с cookie. Я выяснил, что если заголовок same_site установлен в значение "lax", то домены должны быть одинаковыми. Невозможно установить значение на Null, так как Google Chrome автоматически конвертирует его обратно в "lax". Я изменил значение на "none", но в таком случае браузер требует использования HTTPS. <br/> Я настроил Vite на фронте следующим образом: <br/> import mkcert from 'vite-plugin-mkcert' <br/> server: { <br/> host: 'changed-sanctum-vue.test', <br/> https: true <br/> } <br/> + в main.js: <br/> axios.defaults.baseURL = ' <a href="https://laravel-sanctum-vue.test" rel="nofollow">...
  • 1 февраля 2025 г. 13:14
Ответы на вопрос 1
Для настройки аутентификации между проектом на Laravel (бэкенд) и Vue (фронтенд), работающим на разных доменах, с использованием Laravel Sanctum и поддержкой cookie, нужно выполнить несколько шагов. 

### Шаги по настройке

1. **Включите CORS:**
   - Откройте файл `config/cors.php` и добавьте разрешение для вашего фронтенда:
     ```php
     'paths' => ['api/*'], // если вы используете маршрут api
     'allowed_origins' => ['http://changed-sanctum-vue.test:5173'], // добавьте ваш фронтэнд
     'allowed_headers' => ['Content-Type', 'X-Requested-With', 'Authorization', 'X-CSRF-TOKEN'],
     'exposed_headers' => [],
     'max_age' => 0,
     'supports_credentials' => true, // Это важно
     ```

2. **Настройте cookie:**
   - В `config/session.php` установите:
     ```php
     'same_site' => 'none', // позволяет отправлять cookie на разные домены
     'secure' => env('SESSION_SECURE_COOKIE', true), // включите только если используете HTTPS
     ```

3. **Настройте Sanctum:**
   - В `config/sanctum.php`, убедитесь, что у вас включена поддержка CORS:
     ```php
     'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'changed-sanctum-vue.test:5173')),
     ```

4. **Настройте HTTPS:**
   - Так как вы установили `same_site` на `none`, браузер требует, чтобы cookies были переданы через HTTPS. Используйте `mkcert` для настройки локальной среды с HTTPS.

5. **Настройка Axios на фронтенде:**
   - Убедитесь, что ваши настройки Axios были обновлены для включения credentials:
     ```javascript
     import axios from 'axios';

     axios.defaults.baseURL = 'https://laravel-sanctum-vue.test';
     axios.defaults.withCredentials = true; // Включите отправку cookies
     ```

6. **Сертификаты для локальной разработки:**
   - Настройте так, чтобы ваш `vite.config.js` использовал HTTPS:
     ```javascript
     import mkcert from 'vite-plugin-mkcert';

     export default {
       plugins: [mkcert()],
       server: {
         https: true,
         host: 'changed-sanctum-vue.test',
       },
     };
     ```

### Дополнительные рекомендации

- После всех этих изменений всегда очищайте кеш и используйте режим инкогнито, чтобы избежать локальных кешей и кук.
- Проверьте, что как бэкенд, так и фронтенд запущены и могут корректно обрабатывать запросы и ответы.
- Если у вас возникают проблемы, проверьте логи браузера на ошибки CORS или проблемы с cookie.

После выполнения этих шагов ваша аутентификация между двумя проектами должна заработать даже при их размещении на разных доменах.
Похожие вопросы