使用 Socket.IO 进行授权和握手
我们的授权可以通过使用中间件,如下完成:
const io = require('socket.io-client')
const host = "https://127.0.0.1"
const port = 3001;
console.log(io.connect)
const options = {
secure:true,
rejectUnauthorized : false,
transportOptions: {
polling: {
extraHeaders: {
authorization': 'gocpplua',
},
},
}
};
const uri = `${host}:${port}?token=abc`
const socket = io.connect(uri, options);
上面其实是使用了两种方式:
- 通过添加token=abc
- 通过携带额外的请求头 extraHeaders
服务器添加中间件:
const option = {
"key": "X", 'utf8'),
"cert": "X", 'utf8'),
"transports": ["websocket", "xhr-polling", "htmlfile", "jsonp-polling"],
'pingInterval': 5000,
'pingTimeout': 30000
};
var httpsServer = require('https').createServer(option);
var ssio = require('socket.io')(httpsServer);
ssio.set('authorization', function (handshake, callback) {
if (handshake.headers.authorization == 'gocpplua') { // 这里只用了authorization校验,我们还可以使用handshake._query.token校验
return callback(null, true);
}
return callback(new Error('authentication '));
});
连接的时候,服务器调试得到的参数如下:
- handshake._query.token -> abc
- handshake.headers.authorization -> chenqi
我们可以通过校验上面两者,来判断要不要继续进行链接。