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

时间:2018-02-01 09:46:20

标签: javascript android node.js sockets socket.io

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

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

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

     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);
    })
    }
    
  4. 我的问题是,我想发出'消息'事件仅适用于具有与特定用户登录的Web应用程序相同的身份验证的移动应用程序。

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

    我该怎么做?

    谢谢,

3 个答案:

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

基本上,我们为套接字创建了一个身份验证中间件,该中间件仅在通过身份验证的情况下才连接用户。