socket.io-client如何在建立连接时设置请求标头

时间:2014-05-01 10:46:07

标签: node.js socket.io jwt

当socket.io客户端发出连接请求时,我正在尝试设置http标头。有没有办法做到这一点?

以下是我正在做的事情:

// server side
var io = socketio(server);

io.use(function (socket, next) {
  // authorize using authorization header in socket.request.headers
});

// client side
var socket = io();  // i'm trying to set an authorization header in this http reqeust

有什么想法吗?感谢。

7 个答案:

答案 0 :(得分:39)

如果您使用的是socket.io-client> = 1.4,则可以使用JSR 363选项。

例如:

var socket = io("http://localhost", {
  extraHeaders: {
    Authorization: "Bearer authorization_token_here"
  }
});

extraHeaders,它是socket.io-client的后端,engine.io-client

答案 1 :(得分:12)

似乎client doesn't support setting headers,并非所有传输都允许设置标题。

facundoolano的这个post详细说明了一种不需要将身份验证令牌放在查询字符串中的身份验证的解决方法。

他的解决方法模块可以在https://github.com/invisiblejs/socketio-auth找到。

让我想知道为什么在服务器端,socket.io允许访问请求标头...

答案 2 :(得分:2)

自版本2.0.0 / 2017-01-22 engine.io-client supports

[feature] Allow extraHeaders to be set for browser clients in XHR requests (#519)

但是此时socket.io-client没有更新以支持此功能,因此在此之前的几天可能会使这个传奇结束使用以下说明:https://facundoolano.wordpress.com/2014/10/11/better-authentication-for-socket-io-no-query-strings/

答案 3 :(得分:1)

“ transportOptions”选项可用于在socket.io请求中发送额外的标头。我也在这里解释了:-

Node.js + Socket.io | Set custom headers on the server

答案 4 :(得分:0)

简短回答:根据规范是不可能的……如果您只需要尽早传递信息……为什么不查询参数?

socket = io('localhost:5000', {
      path: '/mySocketPath',
      transports: ['websocket'],
      query: {
        token:'some-token-value'
      }
})

见@satpal-07 https://github.com/socketio/socket.io-client/issues/1356#issuecomment-810023635

答案 5 :(得分:0)

有一种新方法可以做到这一点:https://socket.io/docs/v3/middlewares/。查看“发送凭据”部分。

// client
const socket = io(server, {
    transports: ['websocket', 'polling', 'flashsocket'],
    auth: {
        token: 'abc'
    }
});

// server
io.use((socket, next) => {
    const token = socket.handshake.auth.token;
    if (isValidJwt(token)){
        next();
    }else{
        next(new Error("Socket authentication error"));
    }
});

async function isValidJwt(token){
    jwt.verify(token, secrets.jwt, function(err, decoded) {
        if (err){
            console.log(err);
            return false;
        }else{
            //console.log(decoded);
            return true;
        }
    });
}

答案 6 :(得分:-1)

自socket.io 1.0

以来,该信息已被弃用

有两种授权方法:全局或命名空间(思考路径)。使用io.set('authorization', function (handshakeData, callback)配置调用在服务器上设置全局方法。

handshakeData对象包含以下信息:

{
   headers: req.headers       // <Object> the headers of the request
 , time: (new Date) +''       // <String> date time of the connection
 , address: socket.address()  // <Object> remoteAddress and remotePort object
 , xdomain: !!headers.origin  // <Boolean> was it a cross domain request?
 , secure: socket.secure      // <Boolean> https connection
 , issued: +date              // <Number> EPOCH of when the handshake was created
 , url: request.url          // <String> the entrance path of the request
 , query: data.query          // <Object> the result of url.parse().query or a empty object
}

上述信息和更深入的解释可在此 documentation page上找到。