SailsJS - 将sails.io.js 与JWT 一起使用
Posted
技术标签:
【中文标题】SailsJS - 将sails.io.js 与JWT 一起使用【英文标题】:SailsJS - using sails.io.js with JWT 【发布时间】:2015-07-18 06:10:11 【问题描述】:我已经实现了一个 AngularJS 应用程序,通过 websockets 与 Sails 后端通信,使用sails.io.js。
由于后端基本上是一个纯 API,并且也将与其他应用程序连接,因此我正在尝试完全禁用会话并使用 JWT。
我已经设置了 express-jwt 并且可以很好地使用常规 HTTP 请求,但是当我通过sails.io.js 发送请求时,什么都没有发生 - websocket 请求一直挂在客户端上,并且没有任何事情发生服务器(具有“愚蠢”的日志级别)。
我尝试修补sails.io.js 以支持query parameter,并且在连接时,我从Angular 发送令牌,但在最好的情况下,我收到来自express-jwt 的错误消息的响应说缺少凭据...
我还看到了一些提示,即 Sails 中的 socket.js 需要使用 beforeConnect 进行修改,我见过 socketio-jwt,但不知道在 Sails 中的何处以及如何插入。
有没有人实现过这个并且正在使用带有 Sails 和套接字的 JWT?我会很感激任何关于前进方向的提示:)
【问题讨论】:
【参考方案1】:我意识到我已经制定的政策以及使用 express-jwt 对我来说太抽象了,所以我没有弄清楚到底发生了什么。在查看了其他示例后,我发现我只需要检查 websocket 请求与常规请求的不同之处,我很快就找到了解决问题的方法。
所以:
-
设置令牌签名并在登录时发送
Angular 获取令牌并保存到本地存储
为 HTTP 请求创建拦截器以添加授权标头和令牌
修复sails.io.js 以转发通过选项提供的查询参数(如问题中所述)
使用sails.io.js连接时,发送token作为查询参数,即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();
);
;
效果很好! :)
【讨论】:
以上是关于SailsJS - 将sails.io.js 与JWT 一起使用的主要内容,如果未能解决你的问题,请参考以下文章