socket.io连接角色身份验证

时间:2014-10-03 09:17:53

标签: node.js express socket.io

我正在考虑在socket.io连接之上实现角色/身份验证模型。关于这一点有很多,特别是对于令牌认证。但是我在下面附上的内容呢?这种方法会出现什么问题?

以下代码的想法是只允许对特定角色的socket.io连接进行访问。

var role = true;

module.exports = function (io) {

  if (role == true){
    'use strict';
    io.on('connection', function (socket) {
      socket.on('chat message', function(msg){
      io.emit('chat message', msg);
    });
   });
  };
};

1 个答案:

答案 0 :(得分:0)

您可以使用Passport.socketio来验证套接字连接。它非常适合快递。这是一个示例应用程序:

var express = require('express');
var passport = require('passport');
var passportSocketIo = require("passport.socketio");
var cookieParser = require('cookie-parser');
var session      = require('express-session');
var app = express();
var RedisStore = require('connect-redis')(session);
var sessionStore = new RedisStore({
  host: 'localhost',
  port: 6379,
  db: 2,
});

app.use(session({
  store: sessionStore,
  secret: 'YOUR_SECRET_HERE'
}));

app.use(passport.initialize());
app.use(passport.session());


var io = require('socket.io').listen(http.createServer(app).listen(app.get('port'), function(){
    console.log('Express server listening on port ' + app.get('port'));
}));

io.use(passportSocketIo.authorize({
  cookieParser: cookieParser,
  secret:      'YOUR_SECRET_HERE',
  store:       sessionStore,
}));

在您的情况下,您必须将角色添加到护照用户。然后可以在 socket.request.user

中访问用户信息
io.sockets.on('connection', function(socket) {
  var user = socket.request.user;
  if (user.role == true){
    //do something
  }
});

请注意,您必须使用sessionStore,本地存储不能与护照一起使用。请参阅上面的Git页面了解不同的可能性。