0

我一直试图让 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 必须与 API 位于同一个子域中才能使 Airlock 工作。这是真的?

4

1 回答 1

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,
   // ...
];
于 2020-03-14T15:00:29.433 回答