gpt4 book ai didi

socket.io - SailsJS - 将 sails.io.js 与 JWT 结合使用

转载 作者:行者123 更新时间:2023-12-02 22:52:59 24 4
gpt4 key购买 nike

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

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

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

我尝试修补 sails.io.js 以支持 query parameter ,并且在连接时,我从 Angular 发送 token ,但在最好的情况下,我收到来自 express-jwt 的错误消息响应,指出凭据丢失...

我还看到一些提示,sails中的socket.js需要用beforeConnect修改,我见过socketio-jwt ,但不知道在 Sails 中将其插入何处以及如何插入。

有人实现了这个并且正在将 JWT 与 Sails 和套接字一起使用吗?我很感激任何有关该往哪个方向的提示:)

最佳答案

我意识到我所制定的使用express-jwt的政策对我来说太过抽象,所以我不知道到底发生了什么。当我查看其他示例后,我发现我只需要检查 websocket 请求与常规请求的不同之处,并且我很快找到了解决该问题的方法。

所以:

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

    });

    };

效果很好! :)

关于socket.io - SailsJS - 将 sails.io.js 与 JWT 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30104981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com