node.js - 保护 Socket.io

标签 node.js authentication ssl websocket socket.io

我正在使用基于 Node.js 的 https 服务器,该服务器使用 HTTP Basic 进行身份验证(这很好,因为数据是通过 SSL 加密连接发送的)。

现在我想提供一个 Socket.io 连接,应该是

  1. 加密和
  2. 仅适用于经过身份验证的用户。

问题是如何做到这一点。我已经发现在连接到套接字时需要在客户端 JavaScript 代码中指定 { secure: true } ,但是如何在服务器端强制套接字连接只能运行SSL,并且它仅适用于经过身份验证的用户?

我猜 SSL 是最简单的部分,因为 Socket.io 服务器只绑定(bind)到 https 服务器,所以它应该只使用 SSL 运行,并且不应该通过(另外)运行它运行http服务器,对吧?

关于另一件事,我一点也不知道如何确保只有在用户使用 HTTP Basic 成功进行身份验证后才能建立套接字连接。

有什么想法吗?

最佳答案

编辑:当然,OP 在他们的其他答案中是正确的;更重要的是,如果 socket.io >1.0,你可以使用 socket.io-express-session .

原答案:

Socket.io 支持通过 io.set('authorization', callback) 机制进行授权。参见相关文档:Authorizing .这是一个简单的示例(使用基于 cookie 的 session 和连接/表达 session 存储进行身份验证——如果您需要其他内容,只需实现另一个“授权”处理程序):

var utils = require('connect').utils;

// Set up a session store of some kind
var sessionId = 'some id';
var sessionStore = new MemoryStore();
// Make express app use the session store
app.use(express.session({store: sessionStore, key: sessionId});

io.configure(function () {
    io.set('authorization', function (handshakeData, callback) {
        var cookie = utils.parseCookie(handshakeData.headers.cookie);

        if(!(sessionId in cookie)) {
            return callback(null, false);
        }

        sessionStore.get(cookie[sessionId], function (err, session) {
            if(err) {
                return callback(err);
            }

            if(!('user' in session)) {
                return callback(null, false);
            }

            // This is an authenticated user!
            // Store the session on handshakeData, it will be available in connection handler
            handshakeData.session = session;

            callback(null, true);
        });
    });
});

关于node.js - 保护 Socket.io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14600472/

相关文章:

javascript - 如何使用 nodejs 部署 Angular 应用程序

javascript - 使用 Casperjs 的两个标签检索内容

node.js - paypal rest sdk如何识别哪个卡号属于哪个卡种?

php - 新用户无法登录PHPmyadmin

html - https 站点上的 hitbox iframe

c# - Linux 中的 SSL WebRequest

android - Android 7 中的 SSLException 而不是 6

javascript - 使用 Node JS 更改 XML 数据的值

java - Google App Engine - 仅对 POST 方法应用安全约束?

css - laravel 5.3.16 不包括 Bootstrap 功能?