CSRF 令牌不匹配:Nuxt 与 Symfony (pimcore) 后端

问题描述 投票:0回答:1

设置: docker 容器上的 nuxt 另一个 docker 容器上的 pimcore

在 nuxt 配置中:

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 它使用(用于存储): 供应商/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());
    }

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

非常感谢任何帮助

symfony nuxt.js csrf pimcore
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.