提问人:gvanto 提问时间:11/16/2023 更新时间:11/16/2023 访问量:13
CSRF 代币不匹配:Nuxt 与 Symfony (pimcore) 后端
CSRF token mismatch: Nuxt with Symfony (pimcore) backend
问:
设置: 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());
}
从日志输出中可以看出,POST 请求检索的存储值(在 SessionTokenStorage 或 $this->storage-getToken()上)与 GET 请求期间上次创建的存储值不同(以创建要开始的令牌)。 因此,检查失败了......
任何帮助非常感谢
答:
OK 更新 - 原来这是由于服务器上的会话不正确,因为在 axios 调用期间未传递 PHPSESSID cookie。
cookie-universal-nuxt 库在这里对于获取 nuxt 中的 cookie 很有用(vue-cookies 似乎由于某种原因无法访问 PHPSESSID cookie)。
评论