CSRF 代币不匹配:Nuxt 与 Symfony (pimcore) 后端

CSRF token mismatch: Nuxt with Symfony (pimcore) backend

提问人:gvanto 提问时间:11/16/2023 更新时间:11/16/2023 访问量:13

问:

设置: Docker 容器上的 Nuxt 另一个 Docker 容器上的 PIMcore

在nuxt config中:

env: {
        apiDomain: process.env.VUE_APP_API_DOMAIN || "http://localhost:8000/api",
        cookieDomain: process.env.COOKIE_DOMAIN || "http://localhost",
        cookieSecure: false
    },

我有一个vue(nuxt)表单,它通过对服务器的vuex fetch调用在页面加载时检索CSRF令牌,该服务器获取令牌并返回它:

$token = $this->csrfTokenManager->getToken('enquire_form')->getValue();

tokenManager 类型: 供应商/symfony/symfony/src/Symfony/Component/Security/Csrf/CsrfTokenManager.php 其用途(用于存储): vendor/symfony/symfony/src/Symfony/Component/Security/Csrf/TokenStorage/SessionTokenStorage.php

在上面将此令牌称为 A

当表单通过 (axios) post 请求提交时,

令牌管理器会检查令牌是否有效: (我已经用一些调试的东西修改了这段代码,很抱歉造成混乱,但功能没有改变)

public function isTokenValid(CsrfToken $token)
    {
        logger('DBG: ' . __METHOD__ . ' start');

        logger('DBG: ' . __METHOD__ . ' namespace=' . $this->getNamespace()); // empty for both pim + PM

        logger('DBG: ' . __METHOD__ . ' token.getId=' . $token->getId());

        $namespacedId = $this->getNamespace().$token->getId();

        logger('DBG: ' . __METHOD__ . ' namespacedId=' . $namespacedId);

        logger('DBG: ' . __METHOD__ . ' storage.class=' . get_class($this->storage));

        if (!$this->storage->hasToken($namespacedId)) {
            logger('DBG: ' . __METHOD__ . ' no token in storage');

            return false;
        }

        logger('DBG: ' . __METHOD__ . ' STORAGE HAS TOKEN');

        $storageToken = $this->storage->getToken($namespacedId);
        logger('DBG: ' . __METHOD__ . ' storageToken=' . $storageToken);

        $tokenValue = $token->getValue();
        logger('DBG: ' . __METHOD__ . ' tokenValue=' . $tokenValue);

        return hash_equals($storageToken, $tokenValue);

        //return hash_equals($this->storage->getToken($namespacedId), $token->getValue());
    }

enter image description here

从日志输出中可以看出,POST 请求检索的存储值(在 SessionTokenStorage 或 $this->storage-getToken()上)与 GET 请求期间上次创建的存储值不同(以创建要开始的令牌)。 因此,检查失败了......

任何帮助非常感谢

symfony nuxt.js csrf pimcore

评论


答:

0赞 gvanto 11/23/2023 #1

OK 更新 - 原来这是由于服务器上的会话不正确,因为在 axios 调用期间未传递 PHPSESSID cookie。

cookie-universal-nuxt 库在这里对于获取 nuxt 中的 cookie 很有用(vue-cookies 似乎由于某种原因无法访问 PHPSESSID cookie)。