建立连接时,我可以通过 io.connect(url, {query:'key=value'}) “访问”查询字符串
我希望能够对标题做类似的事情。
我想用它来构建带有令牌身份验证的 webapi。
也想拥有这个。
我认为在发出请求时说“设置”标题可能会更好。
预期标头更改的问题是某些传输不允许它们:
<script>
)不允许它们允许我们设置特定标头的唯一条件是强制 socket.io仅使用 XHR 轮询
我期待类似的东西能够对客户端进行身份验证。 在查询字符串中发送授权令牌(或密码)不是一个好主意。
我创建了一个模块来在正文中发送凭据: https ://github.com/invisiblejs/socketio-auth
@rauchg您能否进一步解释一下, https ://github.com/Automattic/socket.io/wiki/authorizing#handshaking 上的文档说:
The handshake is initiated with either an XHR request or a JSONP request
因为:
Users might want to authorize the clients based on information from the headers or IP address
自从:
Not all transports sends headers when they attempt to establish a real time connection with the server
那么这是否表明即使握手在 XHR 中它仍然可以建立 WS 连接,因此使用请求标头进行授权是可以的?
看起来您在某个阶段确实有代码https://github.com/Automattic/socket.io-client/issues/344#issuecomment -9424237
所以我猜测存在问题,所以除了看起来已经被删除的 cookie 之外,它从未进入主仓库。 在这种情况下,最好更新服务器文档,这有点误导http://socket.io/docs/server-api/#namespace #use%28fn:function%29:namespace
var io = require('socket.io')();
io.use(function(socket, next){
if (socket.request.headers.cookie) return next();
next(new Error('Authentication error'));
});
因为它表明 cookie(即标头)可用于身份验证。 并在主站点上的过时身份验证 wiki 文档中添加一个替换项,其中包含身份验证示例并提及其他方法的问题,因为我确信这是一种常见情况。
+1 对此有一些解决方案。 文档和示例占用了我的时间,因为我希望更好地访问设置令牌身份验证的标头。
+1。 即将发布的 engine.io 客户端可以访问标头,这应该有助于解决此问题。
https://github.com/socketio/engine.io-client/pull/379
这也可以从客户端 JS 库中获得吗? 另外,它真的进入了吗? 我看到它已合并,但我不认为它是可操作的,可能是错误的
+1。 我遇到了类似的情况,我需要对浏览器客户端进行身份验证。 socket.io-client 似乎不允许这样做。
+1 对此有任何更新吗?
对此有何更新?
对此有何更新?
由于2.0.0
,您现在可以提供extraHeaders
对象:
const socket = io({
transportOptions: {
polling: {
extraHeaders: {
'x-clientid': 'abc'
}
}
}
});
在此处添加到文档中。
由于
2.0.0
,您现在可以提供extraHeaders
对象:const socket = io({ transportOptions: { polling: { extraHeaders: { 'x-clientid': 'abc' } } } });
在此处添加到文档中。
尽管我将cors
与express
$ 一起使用,但我收到以下 CORS 错误:
对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态。
@4nubhav你必须像这样传递一个handlePreflightRequest 函数:
handlePreflightRequest: (request, response) => {
const headers = { ... };
response.writeHead(200, headers);
response.end();
}
由于
2.0.0
,您现在可以提供extraHeaders
对象:const socket = io({ transportOptions: { polling: { extraHeaders: { 'x-clientid': 'abc' } } } });
在此处添加到文档中。
我在 Socket 服务器中使用.of("/path")
,然后在声明 URL 的地方使用。
@4nubhav您应该在服务器端允许带有handlePreflightRequest
的标头。
const options = {
handlePreflightRequest: (req, res) => {
res.writeHead(200, {
'Access-Control-Allow-Headers': 'x-clientid', // <<< this
});
res.end();
},
};
const io = require('socket.io')(server, options);
最有用的评论
+1 对此有任何更新吗?