Vue3 + Quasar SPA 尝试使用 Laravel API 进行身份验证并获取 CSRF 令牌不匹配(419 状态代码)[已关闭]

Vue3 + Quasar SPA trying to authenticate with a Laravel API and getting a CSRF token mismatch (419 status code) [closed]

提问人:j_gomes 提问时间:11/15/2023 最后编辑:j_gomes 更新时间:11/16/2023 访问量:66

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

5天前关闭。

这篇文章在4天前被编辑并提交审核。

我有一个应用程序 SPA Vue3 + Quasar 和一个后端 Laravel API,在同一个域 (localhost) 上,我的 SPA 在端口 8080 上,我的 API 在端口 80 上。

在 SPA 中,每次刷新页面时,我都会向 /sanctum/csrf-cookie 发送 GET,CSRF 令牌将存储在浏览器应用程序 cookie 中。

此外,axios 在申请时正确发送 CSRF 令牌。

我尝试使用我的 Laravel API(不带 /api 前缀的 /login)进行身份验证,在开发环境中,然后我收到 419 状态代码。

我不知道是否重要,但我的 API 在 docker 容器上使用 Sails 运行。

Quasar/Vue 上的 Axios 配置:

axios.defaults.withCredentials = true;
axios.defaults.baseURL = 'http://localhost/'
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'

Laravel .env

...
APP_URL=http://localhost
...
SESSION_DRIVER=cookie
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost:8080

cors.php

    'paths' => ['api/*', 'sanctum/csrf-cookie', 'login'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['*'],
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => true,

内核.php,

        'api' => [
            EnsureFrontendRequestsAreStateful::class,
            ThrottleRequests::class . ':api',
            SubstituteBindings::class,
        ],

我对 /login 的请求的 Cookie 标头:

Cookie:
XSRF-TOKEN=eyJpdiI6InJ0SXhRZDVEL21JaEUvL0ptTGdmUlE9PSIsInZhbHVlIjoiU28zenNEQ1VOYTR3NXRVd1JtcU1RaUsvK1BCTHpNUGtUZ3c3T3I0d3lKQjhlZzNjMkVIeDBoOFZWanJDVkw2cWc0RGRDM0NWako0cnN1RXdveThwZkE4dW51aS9Ia1FYVXVsSlpqdW9CK1F3amJTMlFITzhpSCtudDYvY2VpUnUiLCJtYWMiOiIyODkyMzhjYjU5YzMzODY2YTkxZTY3M2MzOWZkNDkwMGQyYjBjNDg0ZTgwMzM3ZDc5NjYwYTcyNWFmZTUyZjExIiwidGFnIjoiIn0%3D; laravel_session=eyJpdiI6IlQxYXZ4WGhYZGZ5Lzk2WlF5QzJRUHc9PSIsInZhbHVlIjoidE5QQUpaeFh3WWg4cjFJNG82SXNDY1FGUmplWFN5cG5na08zazRmbXFJRFhJVWdUZS81UzJ1RWNaaC84VWxxcTFPdWNuTXd5K0pDaW0zTDliME5BSHl2ZGw4M01lbk1EUDl6SnlVWWFLM2lxNHBTOFBmei9QQXhMaTZLazJSeEEiLCJtYWMiOiIwNjFlNTFkNzIzZTIyZDhjYTg0MmVhMGViMGZjYTU4MmZjY2VmOGMyOWRjODgyNGY3NmE3NjExZDIyYWVhMDU1IiwidGFnIjoiIn0%3D; 3mcV2b1Mp2zT3MoKAWWTOeGlp0TkNFu9FneRzMLK=eyJpdiI6InY1cUYwaXhjdnZlQVRiNDNqaFRMMEE9PSIsInZhbHVlIjoiaE52dVg0dnRYdmE2dDVUT0lUUkJWeXAyaXNkaXMvZkw3RjJwT0hrbkdybUx4K0JyZ2RZV2lMYjEvT3F2TUEvOWQzejkxN05SaHlZMVliUktmUnhVRkwwYTB4cDYzUVB5VFA3MnA5SmlhMmc1Y0VSY3NyMm1JVnd2Vk1XZmFlWU05dEZJWVQrSjFqQ2h6aktFemdFVWZ6cjJBM2MydHNIMlcxRSsvWk1xaDU0Y1RDcHBFUndOL2ZlMXBVWVhyUEQrNS8vOTI5Qmx0TmpMQUtZQ0sxUHZLMEd5MnpGdC91SnVDeDJ5RkF4Tkc0dUphNHhLRFQwUE5Vc0hlR29JaVZqQ3p4Yi9wTFpMUE42UmJOWXoxN0V2bGZlZHduTVRmZUdkcHVnLzBkOWQ0emQyajhjelptSG9XUzRDb3lmZVlpMk5OK1p0R2R2eTdET2FjcTVhVGR4WmRtNVd4ekQ4SHZaeEg3cTUxY0Y2ZVhFdWhJeDh1SUkreUkwdFBmMjErUmdGIiwibWFjIjoiYWVmY2NkY2NiZmJiY2ZhNjkyMTVhODE2MTg0MjkxNTYxZWQ0N2I4NzMyY2RjOWE2NDdiNGY4NjljYjk5NDY0YyIsInRhZyI6IiJ9

编辑:

我发现了一个新观点:

Axios 添加了一个名为“Cookie”的标头,并在其中放置了 XSRF-TOKEN。 我手动添加了一个名为“X-XSRF-TOKEN”的标题,其中包含我的cookie,该cookie已存储在应用程序的Cookie中...终于奏效了。 但是我在许多教程中看到这个过程是由 Axios 自动完成的......我怎样才能做到这一点?

    const login = async () => {
      let cookies;
      await axios.get("/sanctum/csrf-cookie").then((response) => {
        const { get } = useCookies(['XSRF-TOKEN']);
        cookies = get('XSRF-TOKEN');
      });

      axios.defaults.headers['X-XSRF-TOKEN'] = cookies;
      await axios.post("/login", form).then((response) => {
        console.log(response)
      });
    }
Laravel Vue.js API CSRF 类星体

评论

0赞 Ken White 11/15/2023
请不要上传代码/数据/错误的图像。此外,请编辑您的问题标题,以清楚地解释您遇到的问题或您提出的问题。您当前标题的大部分内容都是无用的标签重复。如果您参加导览并阅读帮助中心页面以了解网站的工作原理,您会发现在开始发布之前,您在这里的体验会好得多。
0赞 gre_gor 11/15/2023
这一切与CORS有什么关系?

答:

0赞 alihardan 11/30/2023 #1

这是之后的已知问题。您必须修改 axios 配置并设置为 true,如下所示:Axios 1.6.0withXSRFToken

axios.defaults.withCredentials = true;
axios.defaults.withXSRFToken = true;

看一看 https://github.com/laravel/docs/pull/9152