对于 API 请求,我在请求时发送带有身份验证标头的 jwt。所以我从 jwt 获得信息。但是使用 websocket 无法设置标头。
我也不想在每个请求中将 jwt 设置为数据。所以我想实现身份验证(服务器端(,将数据从 jwt 保存到 redis 数据库,并将套接字 ID 作为密钥。
现在我遇到了一个问题,套接字或套接字 id 不是钩子中羽毛上下文的一部分,或者只能作为符号女巫使用,我现在不知道如何获得它。但我认为必须有一个更优雅的版本来说明如何与套接字结合使用来保存数据并再次获取主题。
哪种方法是将用户数据保存在套接字连接中,而不是每次都再次发送数据?
Mabye 如果有人可以告诉我如何阅读以下结构中的符号,也会有所帮助:
connection: {provider: "socketio", Symbol(@feathersjs/socketio/socket): Socket}
此处的 API 文档中介绍了如何在没有 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>`
}
});
我在一个模拟问题中找到了一个解决方案:如何向 FeathersJS 套接字连接添加参数
可以通过将信息添加到连接socket.feathers
来将信息保存到连接中,并且它将在每个后续请求中作为参数添加。
插座中间件
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。