7

我已经实现了一个 AngularJS 应用程序,通过 websockets 与 Sails 后端通信,使用sails.io.js。

由于后端基本上是一个纯 API,并且也将与其他应用程序连接,因此我正在尝试完全禁用会话并使用 JWT。

我已经设置了 express-jwt 并且可以很好地使用常规 HTTP 请求,但是当我通过sails.io.js 发送请求时,什么都没有发生 - websocket 请求在客户端保持挂起,并且服务器上没有任何事情发生(具有“愚蠢”的日志级别)。

我已经尝试修补sails.io.js 以支持查询参数,并且在连接时,我从Angular 发送令牌,但在最好的情况下,我收到来自express-jwt 的错误消息的响应,说凭据丢失。 ..

我还看到了一些提示,即 Sails 中的 socket.js 需要使用 beforeConnect 进行修改,我已经看到了 socketio-jwt,但不知道在 Sails 中的何处以及如何插入它。

有没有人实现了这个并且正在使用带有 Sails 和套接字的 JWT?我会很感激任何关于前进方向的提示:)

4

1 回答 1

8

我意识到我已经制定的政策和使用 express-jwt 对我来说太抽象了,所以我没有弄清楚到底发生了什么。在查看其他示例后,我发现我只需要检查 websocket 请求与常规请求的不同之处,我很快就找到了解决问题的方法。

所以:

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

它运作良好!:)

于 2015-05-15T10:30:36.513 回答