Laravel Airlock-CSRF令牌不匹配

时间:2020-03-04 19:34:38

标签: laravel laravel-airlock

我一直试图让Laravel Airlock与我正在开发的新Web应用程序一起工作,但是无论我如何尝试,我都无法使其正常工作。

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

session.php具有:

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

在我的Vue应用程序中,我正在运行此Axios请求,但我不断收到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开发者工具时,没有设置cookie。

我还读到,SPA必须与Airlock的API位于同一子域中。这是真的吗?

1 个答案:

答案 0 :(得分:2)

经过几天的搜索,它可以和我一起工作。

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); 
    }
}

在Kernel.php中

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