node.js - 动态更改 socket.io 来源
问题描述
我正在使用 SocketIo 运行节点应用程序并在启动应用程序时创建套接字服务器。此时还指定了允许域的列表。
应用程序.js
async function listenCallback(server) {
try {
const domains = await db.raw('select distinct domain from users');
global.io = new SocketIo(server, domains);
} catch (err) {
server.close();
}
}
socket.js
class SocketIo {
constructor(server, domains) {
domains[0].map(row => {
whitelist.push(`https://${row.domain}:*`)
});
this.io = socketIo(server, {
origins: whitelist.join(' '),
secure: process.env.SSL_SERVER === 'true',
});
}
updateOrigins(domains) {
???
}
当服务器已经运行时,如何动态更新源(在 updateOrigins 中)?
解决方案
您可能想要查找每个连接的来源。像这样的东西会在每次连接尝试(未调试)时调用源验证函数。也许它会为你工作?
io.origins( function (origin, callback) {
try {
const sql = db.format ('select distinct domain from users where domain = ?', [origin])
db.query(sql, function (error, results, fields) {
if (error) {
console.error ('error looking up origin in database', origin, error)
return callback ('origin lookup failed', false)
}
/* if we got any rows back, we have an origin match */
if (results.length > 0) return callback (null, true)
return callback ('origin not allowed', false)
})
}
catch (err) {
console.error ('error looking up origin in database', origin, err)
return callback('origin lookup failed', false)
}
});
您可能希望实现某种原始缓存以避免过于频繁地重复数据库查找。
推荐阅读
- visual-studio - 我想为 Visual Studio 中的每个构建增加构建修订版本
- python - 如何设置整个 QTableWidget 的边框颜色,而不是项目
- linux - GCP VM 实例中的进程自动终止
- pdf - AppleScript/Automator:使用此 PDF 的提取文本内容重命名 PDF
- subdomain - 具有域指向的经销商 Web 应用程序
- oauth-2.0 - 从 3rd 方 API 获取令牌后,我应该生成自己的令牌吗?
- react-native - 使用官方文档创建一个演示 react-native 应用程序
- entity-framework - .Net Core EF re 包括手段
- performance - 现代 CPU 是否需要花费大量资源来保持标志更新?
- php - 用和不用逗号替换子字符串