验证套接字io连接

时间:2016-04-22 08:33:00

标签: node.js flask socket.io token

如何验证socket.io连接?我的应用程序使用来自另一台服务器(python)的登录端点来获取令牌,当用户在节点端打开套接字连接时,如何才能使用该令牌?

io.on('connection', function(socket) {
    socket.on('message', function(message) {
        io.emit('message', message);
    });
});

客户方:

var token = sessionStorage.token;
var socket = io.connect('http://localhost:3000', {
    query: 'token=' + token
});

如果令牌是在python中创建的:

token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')

如何使用此令牌验证节点中的套接字连接?

2 个答案:

答案 0 :(得分:109)

令牌是否在另一台服务器上创建并不重要。如果您有正确的密钥和算法,您仍然可以验证它。

使用jsonwebtoken模块

的实施

<强>客户端

var token = sessionStorage.token;
var socket = io.connect('http://localhost:3000', {
  query: {token: token}
});

服务器

var io = require('socket.io')();
var jwt = require('jsonwebtoken');

io.use(function(socket, next){
  if (socket.handshake.query && socket.handshake.query.token){
    jwt.verify(socket.handshake.query.token, 'SECRET_KEY', function(err, decoded) {
      if(err) return next(new Error('Authentication error'));
      socket.decoded = decoded;
      next();
    });
  } else {
      next(new Error('Authentication error'));
  }    
})
.on('connection', function(socket) {
    // Connection now authenticated to receive further events

    socket.on('message', function(message) {
        io.emit('message', message);
    });
});

使用socketio-jwt模块

的实施

该模块使客户端和服务器端的身份验证变得更加容易。看看他们的例子。

<强>客户端

var token = sessionStorage.token;
var socket = io.connect('http://localhost:3000');
socket.on('connect', function (socket) {
  socket
    .on('authenticated', function () {
      //do other things
    })
    .emit('authenticate', {token: token}); //send the jwt
});

服务器

var io = require('socket.io')();
var socketioJwt = require('socketio-jwt');

io.sockets
  .on('connection', socketioJwt.authorize({
    secret: 'SECRET_KEY',
    timeout: 15000 // 15 seconds to send the authentication message
  })).on('authenticated', function(socket) {
    //this socket is authenticated, we are good to handle more events from it.
    console.log('hello! ' + socket.decoded_token.name);
  });

答案 1 :(得分:-11)

你可以使用这个网址。

$text = explode("\n",$text);
$text = preg_split("/\n/",$text);