【问题标题】:Laravel Airlock - CSRF token mismatchLaravel Airlock - CSRF 令牌不匹配
【发布时间】:2020-06-17 09:13:06
【问题描述】:

我一直在尝试让 Laravel Airlock 与我正在开发的一个新的网络应用程序一起工作,但无论我尝试什么,我都无法让它工作。

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 工作。这是真的吗?

【问题讨论】:

  • 你在 6.x 还是 7.x 上使用哪个版本的 Laravel?
  • @hinteractive02 - 7.0,昨天刚安装。

标签: laravel laravel-airlock


【解决方案1】:

经过几天的搜索解决方案,它对我有用。

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-07-08
    • 2016-12-10
    • 2016-09-20
    • 2020-01-20
    • 1970-01-01
    • 2020-05-02
    • 2016-10-15
    • 2020-04-14
    • 2015-11-07
    相关资源
    最近更新 更多