对于API请求,我在请求时发送带有身份验证标头的jwt。因此,我从jwt获得了信息。但是使用websocket无法设置标头。
我也不想在每个请求中都将jwt设置为数据。因此,我想实现身份验证(服务器端),以套接字ID作为密钥,将jwt中的数据保存到redis数据库中。
现在我有一个问题,套接字或套接字ID不在钩子中的羽毛上下文中,或者仅作为符号女巫可用,我现在不知道如何获取它。但是我认为必须有一个更加优雅的版本,说明如何与套接字一起保存数据并再次返回主题。
哪种方式是将用户数据保存在套接字连接中,而不是每次都再次发送数据的最佳方法?
Mabye,如果有人可以告诉我如何在以下结构中读取符号,这也将有所帮助:
connection: {provider: "socketio", Symbol(@feathersjs/socketio/socket): Socket}
答案 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。