我在我的应用中使用了框架MEAN.JS:
对于此应用的聊天,我使用实时 SocketIO 库:
v.1.3.5
(服务器: NodeJS )v.0.7
(客户: AngularJS )在此应用中, 2种 登录:
本地:登录后,服务器返回用户对象。
另一个社交网络 OAuth 2.0
:登录后,服务器
重定向到主页/#!/
。
我也在使用:
v.0.3.0
( JSON网络令牌库)JWT
在 SocketIO 中为聊天做出验证用户。
在服务器中,首先,我们需要使用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}})
});
}
})();
服务器解码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
生成的令牌从服务器发送到客户端的最佳方法是什么? (简单方法,更安全) 谢谢!