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 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Apollo-Server,如何与 SailsJS 一起使用?

如何登录 SailsJS

将 Sails Js 与 Angular 2 集成

使用sailsjs 进行REST 验证的挂钩

sh [SailsJS设置] #sailsjs测试

Sailsjs Heroku Postgresql 错误:自签名证书