我已经实现了一个 AngularJS 应用程序,使用 sails.io.js 通过 websockets 与 Sails 后端进行通信。
由于后端基本上是一个纯 API,并且也会从其他应用程序连接,因此我尝试完全禁用会话并使用 JWT。
我已经设置了express-jwt并且可以很好地使用常规HTTP请求,但是当我通过 sails.io.js 发送请求时,根本没有任何反应 - websocket 请求在客户端上保持待处理状态,并且服务器上没有任何反应(具有“愚蠢”的日志级别)。
我尝试修补 sails.io.js 以支持查询参数 https://github.com/balderdashy/sails.io.js/pull/46,并且在连接时,我从 Angular 发送令牌,但在最好的情况下,我收到来自 express-jwt 的错误消息响应,提示凭据丢失...
我还看到一些提示,sails中的socket.js需要用beforeConnect修改,我见过socketio-jwt https://github.com/auth0/socketio-jwt,但不知道在 Sails 中的何处以及如何插入它。
有没有人实现过这个并且正在将 JWT 与 Sails 和套接字一起使用?我很感激任何有关该往哪个方向的提示:)
我意识到我制定的使用express-jwt的政策对我来说太过抽象,所以我不知道到底发生了什么。当我查看其他示例时,我发现我只需要检查 websocket 请求与常规请求的不同之处,并且我很快找到了解决该问题的方法。
So:
- 设置令牌签名并在登录时发送
- Angular 获取令牌并保存到本地存储
- 为 HTTP 请求创建拦截器以添加授权标头和令牌
- 修复 sails.io.js 以转发通过选项提供的查询参数(如问题中所述)
- 使用 sails.io.js 连接时,发送令牌作为查询参数,即 url + '?token=' + token
-
在 sails 策略中,检查 token 的所有组合,包括 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();
});
};
效果很好! :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)