1

情况

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

对于这个应用程序的聊天,我正在使用实时 SocketIO

在这个应用程序中,有2 种登录方式:

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

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

我也在用:

我想要的是?

  • 我想通过JSON Web TokenSocketIO中的用户进行身份验证以进行聊天。 JWT

JSON 网络令牌

第一个

在服务端,首先我们需要对用户的 JSON 对象进行编码,然后返回客户端...JWTTOKEN

(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}})
    });
}

})();

3日

服务端解码 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(简单的方法,更安全)

谢谢!

类似的问题:

更多参考:

4

0 回答 0