繁体   English   中英

使用 socket.io 仅向经过身份验证的用户发送数据

[英]Emitting data only to authenticated user with socket.io

我有一个带有 nodejs 后端的 Web 应用程序,它需要通过套接字与移动应用程序进行通信。 Web 应用程序在标头中有一个与 JWT 集成的注册/登录系统。

我想要做的是:让我们假设用户已登录 Web 应用程序。

  1. 用户从 Web 应用程序发送套接字

     sendSomething(add) { this.socket.emit('add', add); console.log(add);

    }

  2. 服务器收到它,将其发送到移动应用程序

    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); })

    });

  3. 移动应用程序对数据进行处理。

     ngOnInit() { this.socket.on('message', function(socket, message) { console.dir(socket, message); }) }

我的问题是,我只想将“消息”事件发送到与特定用户登录的 Web 应用程序具有相同身份验证的移动应用程序。

因此,如果我以以下身份登录到 WEB 应用程序:example@example.com / somepassword 我只想将消息事件发送到用户使用相同凭据登录的移动应用程序。

我该怎么做?

谢谢,

您必须通过会话密钥或任何其他唯一 ID 来管理套接字连接。 基本上,您必须使用唯一 id 管理连接,以便您可以在需要时找到特定的连接。

让我们假设用户abc@gmail.com登录了一个网站并且它连接到了服务器。 因此,服务器端您将获得abc@gamil.com用户的新连接,因此我们可以存储名称为abc@gmail.com-web连接。 和移动abc@gmail.com-mobile相同。

现在我们有同一用户与不同平台的两个连接,因此当用户从web发送消息时,我们可以使用连接abc@gmail.com-mobile将此消息转发到mobile abc@gmail.com-mobile

更深入:

如果您使用 NodeJs 作为后端,那么您可以使用中间件来处理 JWT 并验证连接了哪个用户。 也可以使用开源库(我从未尝试过) https://github.com/adseason/socketio-jwt-auth

在 socket.io 中,当套接字打开并连接到您的服务器时,它会一直保持到断开连接为止,所以简单地说, io对象的connection回调中的socket对象对于任何未来的发送/接收操作都将保持不变,因此您的解决方案是:

只需替换这一行:

io.emit('message', {type: 'new-add', text: add});

有了这个:

socket.emit('message', {type: 'new-add', text: add});

并且您的message事件在登录的完全相同的用户中触发。

希望我能解决您的问题,这个答案会对您有所帮助!

对于那些仍然想知道如何做到这一点的人,这里是一个代码示例:

    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
    });
   })

基本上我们所做的是为我们的套接字创建了一个 auth 中间件,它只会在通过身份验证的情况下连接用户。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM