【问题标题】:Vue-Cookies Can't Get CookieVue-Cookies 无法获取 Cookie
【发布时间】:2020-02-21 20:06:40
【问题描述】:

我正在尝试设置从我的 Node.js 后端到我的 Vue 前端的 OAuth 服务。目前,后端似乎工作正常;我能够使用我的 google 帐户成功进行身份验证,然后在身份验证后重定向到相应的 UI 视图。 cookie 也正在存储中。

  • 我的节点服务在 localhost:3000 上运行
  • 我的 Vue UI 在 localhost:8080 上运行

我可以使用 document.cookie,它显示:

"express:sess=<Data here>; express:sess.sig=<Data here>"

问题是我使用vue-cookies,无法使用window.$cookies.get(...);检索cookie

在我的main.js 文件中,我正在导入 vue-cookies:

import VueCookies from "vue-cookies";
Vue.use(VueCookies);
window.$cookies.config("7D", "", "localhost");

new Vue({
  router,
  store,
  vuetify,
  render: h => h(App)
}).$mount("#app");

这是我使用该代码的router/index.js

import Vue from "vue";

...
router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {
    debugger;
    if (!window.$cookies) {
      next({
        path: "/login",
        params: { nextUrl: to.fullPath }
      });
    } else {
      const cookie = window.$cookies;
      if (to.matched.some(record => record.meta.isAdmin)) {
        if (cookie.isAdmin) {
          next();
        } else {
          next({
            path: "/login",
            params: { nextUrl: to.fullPath }
          });
        }
      } else {
        next();
      }
    }
  } else {
    next();
  }
});

如果我尝试记录window.$cookies.get("express:sess"),它会返回null。不知道我做错了什么。我知道window.$cookies 也是从控制台定义的,因为我可以看到该对象的所有方法/属性。

如果我从开发者工具创建一个名为“test”的 cookie,我可以检索它:

> window.$cookies.get("test")
> "value"

编辑

如果我将手动创建的 cookie 更改为名称为 test:test,则输出为空! : 字符是否与我无法检索 cookie 的原因有关??

> window.$cookies.get("test:test")
> null

编辑 2: 我可以执行以下操作并查看 cookie 存在,但由于某种原因无法访问它们。

window.$cookies.keys()
(3) […]
​
0: "express:sess"
​
1: "express:sess.sig"
​
2: "test"
​
length: 3

【问题讨论】:

  • 您可以在控制台中尝试document.cookie 并检查您的值吗?
  • @Rayon 我确实尝试过,请参见上文 :) 我确实得到了适当的响应,但我试图避免自己实现 cookie 解析器。

标签: javascript node.js vue.js cookies


【解决方案1】:

您的问题取决于 vue-cookie 如何管理 cookie。如果你看一下set method,你会看到 vue-cookie 在存储 cookie 之前对你的值进行了编码。

示例:

假设你使用 vue-cookie 存储一个 cookie:

$cookies.set('express:sess')

这会将cookie的名称存储为express%3Asess 这是encodeURIComponent('express:sess')的结果

我建议使用其他库或仅使用本机浏览器 API

【讨论】:

  • 当您发布此内容时,我实际上正在查看这段代码。对我来说,问题在于get 方法。但问题还是一样;代码中的 : 字符正在被替换。 See here
  • 没错,这样库的用户就不必关心编码了。我不确定他们为什么要这样设置,但一定有一个很好的理由。
  • 我猜你应该使用相同的 API 来设置和检索 cookie。如果浏览器设置了 cookie,请使用 cookie.get() 方法。
  • 我能够在后端更改 cookie 的名称。但看起来命名 cookie 的标准特别禁止某些字符:A 可以是任何 US-ASCII 字符,控制字符、空格或制表符除外。它也不得包含如下分隔符: ( ) @ , ; : \ " / [ ] ? = { }.
  • 取自 MDN Set-Cookie,但我认为它通常适用于 cookie。它肯定解释了 vue-cookies 的实现
猜你喜欢
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2020-07-19
  • 2022-01-12
  • 2020-07-13
相关资源
最近更新 更多