SailsJS - 使用 sails.io.js 和 JWT
SailsJS - using sails.io.js with JWT
我已经实现了一个 AngularJS 应用程序,使用 sails.io.js 通过 websockets 与 Sails 后端通信。
由于后端基本上是一个纯粹的 API 并且还将与其他应用程序连接,我正在尝试完全禁用会话并使用 JWT。
我已经设置 express-jwt 并且可以很好地使用常规 HTTP 请求,但是当我通过 sails.io.js 发送请求时,什么也没有发生 - websocket 请求在客户端保持挂起状态,并且服务器上没有发生任何事情("silly" 日志级别)。
我尝试修补 sails.io.js 以支持 query parameter,并且在连接时,我从 Angular 发送令牌,但在最好的情况下,我收到的响应是来自 express-jwt 的错误消息说凭证丢失...
我还看到一些提示,需要使用 beforeConnect 修改 sails 中的 socket.js,我已经看到 socketio-jwt,但不知道在哪里以及如何插入它,在风帆.
是否有人实现了这个并且正在使用 JWT 与 Sails 和套接字?我将不胜感激关于前进方向的任何提示:)
我意识到我已经制定的政策使用 express-jwt 离我太远了,所以我不知道到底发生了什么。在查看其他示例后,我发现我只需要检查 websocket 请求与常规请求有何不同,我很快就找到了解决该问题的方法。
所以:
- 设置登录时的令牌签名和发送
- Angular 获取令牌并保存到本地存储
- 为 HTTP 请求创建拦截器以添加授权header和令牌
- 修复 sails.io.js 以转发通过选项提供的查询参数(如问题中所述)
- 使用 sails.io.js 连接时,发送令牌作为查询参数,即 url + '?token=' + token
在sails policy中,检查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();
});
};
效果很好! :)
我已经实现了一个 AngularJS 应用程序,使用 sails.io.js 通过 websockets 与 Sails 后端通信。
由于后端基本上是一个纯粹的 API 并且还将与其他应用程序连接,我正在尝试完全禁用会话并使用 JWT。
我已经设置 express-jwt 并且可以很好地使用常规 HTTP 请求,但是当我通过 sails.io.js 发送请求时,什么也没有发生 - websocket 请求在客户端保持挂起状态,并且服务器上没有发生任何事情("silly" 日志级别)。
我尝试修补 sails.io.js 以支持 query parameter,并且在连接时,我从 Angular 发送令牌,但在最好的情况下,我收到的响应是来自 express-jwt 的错误消息说凭证丢失...
我还看到一些提示,需要使用 beforeConnect 修改 sails 中的 socket.js,我已经看到 socketio-jwt,但不知道在哪里以及如何插入它,在风帆.
是否有人实现了这个并且正在使用 JWT 与 Sails 和套接字?我将不胜感激关于前进方向的任何提示:)
我意识到我已经制定的政策使用 express-jwt 离我太远了,所以我不知道到底发生了什么。在查看其他示例后,我发现我只需要检查 websocket 请求与常规请求有何不同,我很快就找到了解决该问题的方法。
所以:
- 设置登录时的令牌签名和发送
- Angular 获取令牌并保存到本地存储
- 为 HTTP 请求创建拦截器以添加授权header和令牌
- 修复 sails.io.js 以转发通过选项提供的查询参数(如问题中所述)
- 使用 sails.io.js 连接时,发送令牌作为查询参数,即 url + '?token=' + token
在sails policy中,检查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(); }); };
效果很好! :)