You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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');
  });
});

关键部分解释

  1. allowedOrigins 白名单:用Set存储允许的域名,比数组查找效率更高。注意要写完整的域名格式,比如带http://或https://,如果你的域名有自定义端口(比如:3000),也要一并写上。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:22:33