【问题标题】:web socket is not able to read the cookie produced by http with nodejs in Safariweb socket 无法在 Safari 中使用 nodejs 读取 http 生成的 cookie
【发布时间】:2020-03-20 09:27:57
【问题描述】:

我有以下代码在 http 中生成 cookie,稍后我希望 cookie 能够被 websocket (ws) 读取

问题是当我通过 localhost 打开页面时,cookie 能够由 http nodejs 控制器生成,并且 ws 能够访问 cookie。

但是,当我通过IP地址例如192.168.0.3打开http时,我可以看到cookie是由http生成的,但是ws无法读取它。我检查了 ws 的请求标头,但不包括 cookie。 上述场景在 Chrome 浏览器上运行良好,但在 Safari 13.0.3 上无法运行

以下是我生成http cookie的代码(我使用koa2

ctx.cookies.set('token', token, {
    httpOnly: false,
    expires: expiryDate,
})

以下是我在nodejs中读取cookie的方式

let cookies = new Cookies(req, null);
console.log(JSON.stringify(req.headers)); //The header does not contain cookie in Safari 13.0.3 with IP address but in Chrome I can see the header has cookie
let token = cookies.get('token');
console.log('Cookie token is: ' + token);  //token value is undefined

请帮忙。

【问题讨论】:

  • 您是否对创建 cookie 的 http 请求和 webSocket 连接使用完全相同的 URL?请显示这两个的代码。
  • 是的,网址完全相同。该代码具有以下逻辑: 1. 控制器生成 cookie 并在打开 html 页面的位置返回响应 2. html 页面具有调用 ws 后端的 javascript,该后端与控制器位于同一文件夹中。 3. ws读取html javascript传入的请求中的cookie。
  • Safari 以不发送带有 webSocket 连接的 httpOnly cookie 而闻名,但看起来您并不想设置 httpOnly。但是,也许需要验证。

标签: node.js http cookies


【解决方案1】:

好的,原因是当我从 html 页面的 javascript 调用 ws 时,我将 ws 服务器的地址分配为 localhost,这就是为什么当 ws 服务器收到请求时它无法读取由 http 设置的 cookie,这是一个 IP 地址

【讨论】:

    猜你喜欢
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2018-11-14
    相关资源
    最近更新 更多