设置: 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 请求期间最后创建的存储值(用于创建令牌)不同首先)。 因此检查失败......
非常感谢任何帮助
好的更新 - 事实证明这是由于服务器上的会话不正确,因为在 axios 调用期间未传递 PHPSESSID cookie。
cookie-universal-nuxt 库对于获取 nuxt 中的 cookie 很有用(由于某种原因,vue-cookies 似乎无法访问 PHPSESSID cookie)。