Socket.io-client: 允许访问握手标头

创建于 2014-03-14  ·  19评论  ·  资料来源: socketio/socket.io-client

建立连接时,我可以通过 io.connect(url, {query:'key=value'}) “访问”查询字符串

我希望能够对标题做类似的事情。

我想用它来构建带有令牌身份验证的 webapi。

最有用的评论

+1 对此有任何更新吗?

所有19条评论

也想拥有这个。

我认为在发出请求时说“设置”标题可能会更好。

预期标头更改的问题是某些传输不允许它们:

  • WebSocket 不允许自定义标头
  • JSONP 轮询(又名<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'
      }
    }
  }
});

此处添加到文档中。

尽管我将corsexpress $ 一起使用,但我收到以下 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);

更新:在 Socket.IO v3 中,不再需要transportOptions ,您可以简单地使用:

const socket = io({
  extraHeaders: {
    'x-clientid': 'abc'
  }
});

CORS 的文档:

  • v2: https ://socket.io/docs/v2/handling-cors/
  • v3: https ://socket.io/docs/v3/handling-cors/
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

catamphetamine picture catamphetamine  ·  3评论

exilonX picture exilonX  ·  7评论

ahadcove picture ahadcove  ·  7评论

zappfinger picture zappfinger  ·  5评论

Tiboonn picture Tiboonn  ·  6评论