vue -cli frontend не устанавливает CSRF cook ie из Sanctum - PullRequest
0 голосов
/ 05 мая 2020

Я разрабатываю новый интерфейс, используя Vue для доступа к моему существующему приложению Laravel 7, которое использует Sanctum для аутентификации.

Интерфейс находится на app.example.com, а серверный модуль перемещается на api.example.com. Промежуточное ПО CORS и Sanctum настроены правильно, чтобы разрешить app.example.com, и пока все хорошо.

GET to /sanctum/csrf-cookie выглядит нормально, однако, похоже, что на самом деле файлы cookie не устанавливаются , в результате чего последующий запрос к API возвращает 419.

const config = { withCredentials: true };
const api = process.env.NODE_ENV === 'production' ? 'https://api.example.com' : 'http://localhost:9000';

axios.get(api + '/sanctum/csrf-cookie', config)
  .then(() => axios.post(api + '/login', data, config))
  .then(response => response.json())
  .then(response => { console.log('json', response); });

Журнал консоли: enter image description here

Заголовки ответа от / sanctum / csrf-cook ie: response from /sanctum/csrf-cookie

Файлы cookie не указаны в devtools: enter image description here

ОБНОВЛЕНИЕ 1 : Didn не замечал этого раньше; значки предупреждений рядом с каждым Set-Cookie в заголовках ответа отображают «Атрибут домена этого set-cook ie недействителен по отношению к текущему URL-адресу хоста».

1 Ответ

0 голосов
/ 07 мая 2020

Короткий ответ : Порты не должны указываться в атрибутах домена cook ie.

Длинный ответ : Laravel Sanctum использует промежуточное ПО VerifyCsrfToken для отправки и проверки токена CSRF, который использует значения конфигурации сеанса при добавлении Cook ie в ответ :

protected function addCookieToResponse($request, $response)
{
    $config = config('session');

    if ($response instanceof Responsable) {
        $response = $response->toResponse($request);
    }

    $response->headers->setCookie(
        new Cookie(
            'XSRF-TOKEN', $request->session()->token(), $this->availableAt(60 * $config['lifetime']),
            $config['path'], $config['domain'], $config['secure'], false, false, $config['same_site'] ?? null
        )
    );

    return $response;
}

In config/session.php:

'domain' => env('SESSION_DOMAIN', null),

In .env:

SESSION_DOMAIN=localhost:8080

Файлы cookie на одном хосте НЕ различимы портами . Поскольку я указал порт в домене cook ie, браузер пометил cook ie как имеющую недопустимый домен. Удаление порта сделало свое дело.

...