【问题标题】:Passing JWT to Node.js WebSocket in Authorization header on initial connection在初始连接时将 JWT 传递给 Authorization 标头中的 Node.js WebSocket
【发布时间】:2015-10-19 06:21:17
【问题描述】:

我正在设置一个 Node.js 服务器来与我的 Web 应用程序的 WebSocket 通信。我打算使用 JSON Web Tokens 来限制只有已经通过我们的 webapp 进行身份验证的用户才能访问。在研究时,我无法找到支持 Authorization 标头的客户端设置并在初始连接调用中使用它的 Node.js 的 WebSocket 包?

我经常看到通过查询参数传递令牌的建议,这可能不如通过 Authorization 标头传递令牌安全。我错过了什么吗?是否有任何良好的、维护良好的 WebSocket 库允许设置 Authorization 标头客户端,以便我可以防止与服务器的不必要连接?

【问题讨论】:

  • 我正在尝试解决同样的问题。据我所知,浏览器会处理所有标题并且不提供更改它们的方法。我正在尝试向连接 URL 上的查询字符串添加一个令牌,但我努力在服务器端获取该信息(带有 ws 库的 node.js)。我不认为查询参数不安全。你做得怎么样?
  • 我解决了这个问题。使用 ?jwt=blah 查询字符串... var token = url.parse(ws.upgradeReq.url, true).query.jwt;
  • 但这会暴露 jwt 对吗?

标签: node.js websocket authorization jwt


【解决方案1】:

基于浏览器的 WebSocket API does not make it possible to specify HTTP headers。另一方面,查询参数方法很有效,而且还不错(通过 HTTPS 使用时),因此经常使用它。

虽然 Node.js 的 WebSocket 实现可以指定 HTTP 标头,但这仅适用于在 Node.js 中运行客户端时。在浏览器中运行时不起作用。

Einaros 的ws 就是这样一个例子。在 Node.js 中运行时,通过 Authorization 标头传递 JWT 令牌很简单:

var WebSocket = require("ws");

' does not work in browsers
var token = "Replace_this_with_your_JWT_token";
var options = {
    headers: {
        "Authorization" : "JWT " + token
    }
};

var ws = new WebSocket("wss://example.com/path", options);
...

但是当从 Browserify 使用时,要求 ws 只会返回无法传递自定义标头的普通基于浏览器的 WebSocket API。除非 Web 浏览器添加对传递标头的支持,否则通过查询参数传递是可行的方法。

【讨论】:

    猜你喜欢
    • 2020-09-18
    • 1970-01-01
    • 2018-06-26
    • 2018-10-16
    • 2017-12-29
    • 2015-05-20
    • 2023-04-09
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多