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 请求与常规请求有何不同,我很快就找到了解决该问题的方法。

所以:

  1. 设置登录时的令牌签名和发送
  2. Angular 获取令牌并保存到本地存储
  3. 为 HTTP 请求创建拦截器以添加授权header和令牌
  4. 修复 sails.io.js 以转发通过选项提供的查询参数(如问题中所述)
  5. 使用 sails.io.js 连接时,发送令牌作为查询参数,即 url + '?token=' + token
  6. 在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();
    
    });
    
    };
    

效果很好! :)