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

Websocket 从套接字连接获取数据,无需再次发送,websocket,socket.io,feathersjs,Websocket,Socket.io,Feathersjs,对于API请求,我在请求时发送带有身份验证头的jwt。所以我从jwt那里得到信息。但是使用websocket无法设置标题 我也不想在每个请求中将jwt设置为数据。所以我想实现一个身份验证(服务器端),它将数据从jwt保存到一个redis DB,套接字id作为密钥 现在我有一个问题,套接字或套接字id不是钩子中feathers上下文的一部分,或者只能作为符号使用,我现在不知道如何获取它。但我认为必须有一个更优雅的版本来说明如何结合套接字保存数据,并重新获得主题 在套接字连接中保存用户数据的最佳方法

对于API请求,我在请求时发送带有身份验证头的jwt。所以我从jwt那里得到信息。但是使用websocket无法设置标题

我也不想在每个请求中将jwt设置为数据。所以我想实现一个身份验证(服务器端),它将数据从jwt保存到一个redis DB,套接字id作为密钥

现在我有一个问题,套接字或套接字id不是钩子中feathers上下文的一部分,或者只能作为符号使用,我现在不知道如何获取它。但我认为必须有一个更优雅的版本来说明如何结合套接字保存数据,并重新获得主题

在套接字连接中保存用户数据的最佳方法是什么,即不再每次发送数据

也许,如果有人能告诉我如何阅读以下结构中的符号,也会有所帮助:

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

中描述了如何在没有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>`
  }
});
const io=require('socket.io客户端');
常量套接字=io('http://localhost:3030', {
额外标题:{
授权:`持票人`
}
});

我在一个类似的问题中找到了一个解决方案:

通过将信息添加到
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。

是的,但在服务器端,我需要在每次请求时将用户信息保存在jwt中。有了这个,我在进行身份验证时得到了jwt,但不是为了以后完成的请求?我现在也没有在服务器端实现feather身份验证,因为另一个微服务创建了jwt。如何将信息发送到服务器是明确的