MEANJS:SocketIO中的JWT身份验证

时间:2015-07-12 12:12:18

标签: node.js socket.io chat meanjs json-web-token

情况

我在我的应用中使用了框架MEAN.JS

对于此应用的聊天,我使用实时 SocketIO

在此应用中, 2种 登录

  • 本地:登录后,服务器返回用户对象

  • 另一个社交网络 OAuth 2.0:登录后,服务器 重定向到主页/#!/

我也在使用:

我想要什么?

  • 我想通过JSON Web Token JWT SocketIO 中为聊天做出验证用户

JSON Web Token

1RST

在服务器中,首先,我们需要使用JWT用户 JSON对象进行编码,并将TOKEN返回到客户...

(no code for this)

也许是这样的:

  var tokenSecret = '15b949c87eba2e8c949db9512acb401d';
  var token = jwt.encode(req.user, tokenSecret);
  res.jsonp(token);

第二

客户端在SocketIO连接

中向服务器发送相同的accessToken

客户 socket-io.client.factory.js

 (function() {
'use strict';

angular
    .module('core')
    .factory('Socket', Socket);

Socket.$inject = ['socketFactory'];

function Socket(socketFactory) {
    var accessToken = //???
    return socketFactory({
        prefix: '',
        ioSocket: io.connect('http://localhost:8080',{query:{accessToken:accessToken}})
    });
}

})();

3TH

服务器解码Token以检查同一用户,并将userId保存在Socket内,并在连接时将用户加入聊天。

服务器 express.js

// Attach Socket.io
var tokenSecret = '15b949c87eba2e8c949db9512acb401d';
var server = http.createServer(app);
var io = socketio.listen(server);

io.use(function(socket, next) {
    var handshake = socket.request;

    var decoded;

    try {
        decoded = jwt.decode(handshake.query().accessToken, tokenSecret);
    } catch (err) {
        console.error(err);
        next(new Error('Invalid token!'));
    }
    if (decoded) {
        // everything went fine - save userId as property of given connection instance
        socket.userId = decoded.userId; // save user id we just got from the token, to be used later
        next();
    } else {
        // invalid token - terminate the connection
        next(new Error('Invalid token!'));
    }
});

io.on('connection', function(socket){
    socket.join(socket.userId);
    io.on('disconnect', function(){
        socket.leave(socket.userId);
    });
});

问题

我在第一部分有疑问。

在我的第一个想法中,JWT生成的令牌在登录后被发送到用户对象内的客户端。但是如果客户端通过OAuth 2.0登录,则此解决方案不会因为服务器将页面重定向到主页而没有返回任何json,所以工作正常。我正在考虑生成一个返回此令牌的路由API,并执行REST请求以获取令牌......

我的第二个想法是服务器将令牌保存在MongoDB(用户的架构)中。我们始终可以轻松访问令牌。在angularJS中,我们有变量Authentication.user和用户数据,并且不需要生成新的路径API。

我的问题是......

  • JWT生成的令牌从服务器发送到客户端的最佳方法是什么? (简单方法,更安全)

谢谢!

类似的问题:

更多参考资料:

0 个答案:

没有答案