我有一个带有nodejs后端的Web应用程序,需要通过套接字与移动应用程序通信。 Web应用程序在标题中有一个与JWT集成的注册/登录系统。
我想做的是: 让我们假设用户已登录Web应用程序。
用户从网络应用程序发送套接字
sendSomething(add) {
this.socket.emit('add', add);
console.log(add);
}
服务器收到它,将其发送到移动应用
io.on('connection', (socket) => {
console.log('user connected');
socket.on('disconnect', function() {
console.log('user disconnected');
});
socket.on('add', (add) => {
io.emit('message', {type: 'new-add', text: add});
console.log(add);
})
});
移动应用程序可以处理数据。
ngOnInit() {
this.socket.on('message', function(socket, message) {
console.dir(socket, message);
})
}
我的问题是,我想发出'消息'事件仅适用于具有与特定用户登录的Web应用程序相同的身份验证的移动应用程序。
因此,如果我以:example@example.com / somepassword登录到WEB APP 我想仅将消息事件发送到用户使用相同凭据登录的移动应用程序。
我该怎么做?
谢谢,
答案 0 :(得分:0)
您必须通过会话密钥或任何其他唯一ID来管理套接字连接。基本上,您必须使用唯一ID管理连接,以便在需要时找到特定连接。
让我们假设用户abc@gmail.com
已登录网站,并且已连接到服务器。因此,服务器端您将获得abc@gamil.com
用户的新连接,以便我们可以存储名称为abc@gmail.com-web
的连接。和移动abc@gmail.com-mobile
相同。
现在我们有两个同一用户与不同平台的连接,因此当用户从web
发送消息时,我们可以使用连接mobile
将此消息转发至abc@gmail.com-mobile
。
更深入:
如果您使用NodeJ作为后端,那么您可以使用中间件来获取JWT并验证哪个用户已连接。也可以使用开源库(我从未尝试过)https://github.com/adcentury/socketio-jwt-auth
答案 1 :(得分:0)
在socket.io中,当一个套接字打开并连接到你的服务器时,它会保持不变,直到它被断开,所以简单地说,socket
对象connection
回调的io
对象将保持不变任何未来的发送/接收行动,所以你的解决方案是:
只需替换此行:
io.emit('message', {type: 'new-add', text: add});
用这个:
socket.emit('message', {type: 'new-add', text: add});
并且您的message
事件在登录的完全相同的用户中触发。
希望我能解决你的问题,这个答案会对你有所帮助!
答案 2 :(得分:0)
对于那些仍然想知道如何做到的人,这里是一个代码示例:
const socketjwtauth = require("socketio-jwt-auth")
io.use(socketjwtauth.authenticate({
secret: "anythingstrong", //literally keep it strong in the .env file
}, async function (payload, done) {
console.log("sdjsndsadnkajnk")
console.log(payload.email)
}))
//check for the user email from payload against your database
io.on('connection', function (socket) {
console.log('Authentication passed!');
//now you can access user info through socket.request.user
//socket.request.user.logged_in will be set to true if the user was authenticated
socket.emit('success', {
message: 'success logged in!',
user: socket.request.user,
status: socket.request.user.logged_in
});
})
基本上,我们为套接字创建了一个身份验证中间件,该中间件仅在通过身份验证的情况下才连接用户。