【问题标题】:SailsJS - using sails.io.js with JWTSailsJS - 将sails.io.js 与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?我会很感激任何关于前进方向的提示:)

【问题讨论】:

    标签: socket.io sails.js jwt express-jwt


    【解决方案1】:

    我意识到我已经制定的政策以及使用 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-06-19
      • 2015-10-16
      • 2015-09-04
      • 2023-03-17
      • 2019-01-15
      • 2020-04-30
      • 2017-01-25
      • 2018-06-17
      • 2020-08-10
      相关资源
      最近更新 更多