如何使用Node.js ws模块限制WebSocket仅允许指定域名访问?
实现WebSocket域名白名单限制(ws模块)
这个问题很常见,咱们可以通过ws模块自带的验证机制来实现域名白名单,只让你的指定域名能连接WebSocket服务器。核心思路是检查客户端发起连接时的Origin HTTP请求头,只允许预定义的域名通过验证,其他域名直接拒绝握手。
完整修改后的代码示例
const WebSocket = require('ws'); // 定义允许访问的域名列表,注意要包含完整的协议(http/https)和端口(如果有) const allowedOrigins = new Set(['http://anotherdomain.com']); const wss = new WebSocket.Server({ port: 8080, // 关键:添加客户端验证钩子 verifyClient: (info, done) => { const requestOrigin = info.origin; // 验证逻辑:如果Origin在白名单内,允许连接;否则拒绝 if (allowedOrigins.has(requestOrigin)) { done(true); // 允许连接 } else { // 拒绝连接,返回403状态码和自定义提示 done(false, 403, 'Forbidden: Only authorized domains can connect'); } } }); // 后续的连接、消息处理逻辑保持不变 wss.on('connection', (ws) => { console.log('Authorized client connected'); ws.on('message', (data) => { console.log(`Received message: ${data}`); ws.send(`Server response: ${data}`); }); ws.on('close', () => { console.log('Client disconnected'); }); });
关键部分解释
allowedOrigins白名单:用Set存储允许的域名,比数组查找效率更高。注意要写完整的域名格式,比如带http://或https://,如果你的域名有自定义端口(比如:3000),也要一并写上。verifyClient验证钩子:这是ws模块提供的内置验证机制,在客户端发起WebSocket握手时触发,比connection事件更早执行,能在连接建立前就拦截非法请求,节省服务器资源。info.origin:就是发起WebSocket连接的页面所在的域名(浏览器会自动带上这个请求头)。done()函数:调用done(true)允许连接;调用done(false, 状态码, 错误信息)直接拒绝,客户端会收到对应的HTTP错误。
边缘情况处理
- 如果有非浏览器客户端(比如后端服务)发起连接,可能不会发送
Origin头,如果你需要允许这类请求,可以修改验证逻辑:if (!requestOrigin || allowedOrigins.has(requestOrigin)) { done(true); } - 确保域名完全匹配:比如
http://anotherdomain.com和http://www.anotherdomain.com是两个不同的域名,需要都添加到白名单里(如果需要的话)。
测试效果
用http://anotherdomain.com的页面连接WebSocket服务器时,会正常建立连接;而http://baddomain.com的页面发起连接时,浏览器会返回403错误,无法建立WebSocket连接。
内容的提问来源于stack exchange,提问作者user8438001
相关产品推荐
相关产品推荐

