情况
我在我的应用程序中使用框架MEAN.JS:
对于这个应用程序的聊天,我正在使用实时 SocketIO 库:
- Socket.IO
v.1.3.5
(服务器:NodeJS) - Angular-Socket-IO
v.0.7
(客户端:AngularJS)
在这个应用程序中,有2 种登录方式:
本地:登录后,服务器返回用户对象。
另一个社交网络
OAuth 2.0
:登录后,服务器重定向到主页/#!/
。
我也在用:
- JWT-Simple
v.0.3.0
(JSON Web Token库)
我想要的是?
- 我想通过JSON Web Token对SocketIO中的用户进行身份验证以进行聊天。
JWT
第一个
在服务端,首先我们需要对用户的 JSON 对象进行编码,然后返回给客户端...JWT
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}})
});
}
})();
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
?(简单的方法,更安全)
谢谢!
类似的问题:
- MEANJS:SocketIO 中的安全性
- 使用 node.js 和 socket.io 进行套接字身份验证(使用 DaftMonk 的 generator-angular-fullstack)
- 解码 jwt 令牌 - 它安全吗?