我已经实现了一个AngularJS应用,使用sails.io.js通过websocket与Sails后端进行通信。
由于后端基本上是纯API,并且也会从其他应用程序连接到后端,因此我试图完全禁用会话并使用JWT。
我已经设置了express-jwt,并且可以很好地使用常规HTTP请求,但是当我通过sails.io.js发送请求时,什么都没有发生-websocket请求在客户端上一直处于挂起状态,服务器上也没有发生任何事情(与“傻”的日志级别)。
我尝试修补sails.io.js以支持查询参数,并且在连接时从Angular发送令牌,但在最佳情况下,我收到来自Express-jwt的错误消息响应,称凭证丢失。 ..
我还看到了一些提示,说明帆中的socket.js需要使用beforeConnect进行修改,我看到过socketio-jwt,但不知道在帆中将其插入何处以及如何插入。
有没有人实现此功能,并且正在将JWT与Sails和套接字一起使用?我很乐意向任何方向发展:)
我意识到我已经制定了策略,并且该策略使用的express-jwt离我太多了,所以我不知道到底发生了什么。看完其他示例后,我发现只需要检查websocket请求与常规请求有何不同,我很快就找到了解决问题的方法。
所以:
在Sails策略中,检查令牌的所有组合,包括req.socket.handshake.query,如下所示:
module.exports = function (req, res, next) {
var token;
if (req.headers && req.headers.authorization) {
var parts = req.headers.authorization.split(' ');
if (parts.length == 2) {
var scheme = parts[0],
credentials = parts[1];
if (/^Bearer$/i.test(scheme)) {
token = credentials;
}
} else {
return res.json(401, {err: 'Format is Authorization: Bearer [token]'});
}
} else if (req.param('token')) {
token = req.param('token');
// We delete the token from param to not mess with blueprints
delete req.query.token;
}
// If connection from socket
else if (req.socket && req.socket.handshake && req.socket.handshake.query && req.socket.handshake.query.token) {
token = req.socket.handshake.query.token;
} else {
sails.log(req.socket.handshake);
return res.json(401, {err: 'No Authorization header was found'});
}
JWTService.verifyToken(token, function (err, token) {
if (err) {
return res.json(401, {err: 'The token is not valid'});
}
sails.log('Token valid');
req.token = token;
return next();
});
};
效果很好!:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句