拦截(并可能拒绝)Web套接字升级请求

时间:2015-01-19 03:47:17

标签: node.js express websocket

我有一个Node.js服务器,我正在向其发送Web套接字升级请求。此请求的Authorization标头包含登录信息,我需要将其与数据库条目进行比较。我不确定如何在执行数据库查询回调之后停止打开Web套接字连接。

以下是我目前正在做的简化:

var Express = require('express')
var app = Express() 
server = app.listen(app.get("port"), function () {})
server.on("upgrade", function (request, socket) {
//Query database
//On success set "authenticated" flag on request (later accessed through socket.upgradeReq)
//On failure abort connection
})

这样可行,但是套接字打开的时间很短,但我还没有验证授权标头,因此恶意用户可能会发送/接收数据。我通过使用"经过身份验证的"来减轻我的实施风险。国旗,但似乎必须有更好的方式。

我尝试了以下方法,但他们似乎拦截了除升级之外的所有请求:

Attempt #1: 
app.use(function (request, response, next) {
//Query database, only call next if authenticated
next()
})

Attempt #2:
app.all("*", function (request, response, next) {
//Query database, only call next if authenticated
    next()
})

可能值得注意的是: 我也有一个HTTP服务器,它使用相同的端口并接受POST请求进行注册和登录。

感谢您的帮助,如果需要其他信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

我不确定这是否是正确的HTTP协议通信,但对于我来说似乎可行:

server.on('upgrade', function (req, socket, head) {
  var validationResult = validateCookie(req.headers.cookie);
  if (validationResult) {
    //...
  } else {
    socket.write('HTTP/1.1 401 Web Socket Protocol Handshake\r\n' +
                 'Upgrade: WebSocket\r\n' +
                 'Connection: Upgrade\r\n' +
                 '\r\n');
                 socket.close();
                 socket.destroy();
                 return;
  }
  //...
});