Laravel Airlock - несоответствие токена CSRF - PullRequest
0 голосов
/ 04 марта 2020

Я пытался заставить Laravel Airlock работать с новым веб-приложением, которое я разрабатываю, но, несмотря ни на что, я не могу заставить его работать.

шлюз. php имеет следующий набор:

'stateful' => ['https://control.domain.tld',
               'https://management.domain.tld',
               'localhost'],

cors. php имеет:

'paths' => ['api/*', 'login', 'airlock/csrf-cookie'],
'supports_credentials' => true,

Мой .env имеет:

SESSION_DRIVER=cookie

сеанс. php has:

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

В моем приложении Vue я выполняю этот запрос Ax ios, но постоянно получаю несоответствие токена CSRF.

axios.get('https://controlapi-v2.domain.tld/airlock/csrf-cookie').then(response => {
   console.log(response);
});

Я выполнил все гиды онлайн с нулевой удачей. Чего мне здесь не хватает?

Переменная с состоянием в airlock. php имеет 3 URL, так как мое приложение будет на 2 доменах и на localhost для разработки и тестирования. Я только попробовал это на localhost в данный момент, и мне интересно, вызывает ли это проблему.

Если я изменю localhost на http://localhost, я больше не получаю несоответствие токена CSRF, но есть когда я проверяю инструменты Chrome dev, нет набора cook ie.

Я также прочитал, что SPA должен работать на том же поддомене, что и API для работы Airlock. Это правда?

1 Ответ

2 голосов
/ 14 марта 2020

После нескольких дней поиска решения, оно работает со мной.

import Cookies from 'js-cookie'
import axios from 'axios'

axios.defaults.withCredentials = true

axios.get('http://localhost:8000/airlock/csrf-cookie')
   .then(response => {
       Cookies.set("X-XSRF-TOKEN", Cookies.get("XSRF-TOKEN"))
       // Login...
       axios.post('http://localhost:8000/login', {
         email: 'admin@admin.com',
         password: '@admin123'
       }).then((data) => {
         console.log(data);
       })
    });

или

<?php 
namespace App\Http\Middleware; 
use Closure; 

class TransformApiHeaders  { 

    public function handle($request, Closure $next) {

        $cookie_name = 'XSRF-TOKEN'; 
        $token_cookie = $request->cookie($cookie_name); 

        if ($token_cookie !== null) { 
            $request->headers->add(["X-$cookie_name" => $token_cookie]); 
        }

        return $next($request); 
    }
}

в ядре. php

protected $middleware = [
   TransformApiHeaders::class,
   // ...
];
...