从套接字连接获取数据而无需再次发送

时间:2019-09-17 16:02:47

标签: websocket socket.io feathersjs

对于API请求,我在请求时发送带有身份验证标头的jwt。因此,我从jwt获得了信息。但是使用websocket无法设置标头。

我也不想在每个请求中都将jwt设置为数据。因此,我想实现身份验证(服务器端),以套接字ID作为密钥,将jwt中的数据保存到redis数据库中。

现在我有一个问题,套接字或套接字ID不在钩子中的羽毛上下文中,或者仅作为符号女巫可用,我现在不知道如何获取它。但是我认为必须有一个更加优雅的版本,说明如何与套接字一起保存数据并再次返回主题。

哪种方式是将用户数据保存在套接字连接中,而不是每次都再次发送数据的最佳方法?

Mabye,如果有人可以告诉我如何在以下结构中读取符号,这也将有所帮助:

connection: {provider: "socketio", Symbol(@feathersjs/socketio/socket): Socket}

2 个答案:

答案 0 :(得分:0)

API documentation here中介绍了如何在没有Feathers客户端的情况下认证套接字连接。可以通过这样验证连接来完成:

const io = require('socket.io-client');
const socket = io('http://localhost:3030');

socket.emit('create', 'authentication', {
  strategy: 'local',
  email: 'hello@feathersjs.com',
  password: 'supersecret'
}, function(error, authResult) {
  console.log(authResult); 
  // authResult will be {"accessToken": "your token", "user": user }
  // You can now send authenticated messages to the server
});

或在建立套接字连接时发送现有的访问令牌:

const io = require('socket.io-client');
const socket = io('http://localhost:3030', {
  extraHeaders: {
    Authorization: `Bearer <accessToken here>`
  }
});

答案 1 :(得分:0)

我在一个类似的问题中发现了一个变:How to add parameters to a FeathersJS socket connection

可以通过将信息添加到socket.feathers来将信息保存到连接中,并在随后的每个请求中将其作为参数添加。

Socketio中间件

const jwtHandler = (feathers, authorization, next) => {
    const regex = /Bearer (.+)/g;
    const jwt = (regex.exec(authorization) || [])[1]; // todo length >= 2 test.

    try {
        const { accountId, userId } = decode(jwt);
        feathers.accountId = accountId;
        feathers.userId = userId;
        feathers.authorization = authorization;
    } catch (err) {
        throw new Forbidden('No valid JWT', err);
    }

    next();
};

const socketJwtHandler = io => io.use((socket, next) => {
    jwtHandler(socket.feathers, socket.handshake.query.authorization, next);
});

然后在钩子中调用context.param.userId。