Личные сообщения с Socket.io / Express и Mon go DB - PullRequest
0 голосов
/ 11 июля 2020

Я собираю приложение для онлайн-чата, используя Nuxt JS, Express JS, Mon go DB и Socket.io

Я новичок в socket.io и Mon go DB, и я изо всех сил пытаюсь придумать теорию обмена личными сообщениями. В настоящее время пользователь регистрируется и входит в систему с помощью токена JWT. Есть список пользователей (контактов), которых я могу получить из БД. Каждый контакт содержит базовую c информацию, но я также генерирую UUID, чтобы, например, Роберт сообщения Джейн , URL-адрес мог выглядеть так:

https://example.com/conversation/xxxx-xxxx-xxxx-xxxx-xxxx-xxxx -> UUID пользователя, чтобы я мог отправить сообщение на интерфейсе:

this.socket.emit('msg', {
  toid: self.$route.params.id, // this is the UUID from the url
  msg: self.composer.message, // nmessage
  name: self.$store.state.auth.user.uuid // will be replaced with the name
})

И затем на стороне сервера у меня есть следующий прототип :

let users = []
let messages = []
let index = 0

const port = 3030

io.on('connection', socket => {
  // socket.emit('message', 'Welcome to Memo Chat')

  socket.on("private", function(data) {       
      io.sockets[data.to].emit("private", { from: client.id, to: data.to, msg: data.msg });
      socket.emit("private", { from: client.id, to: data.to, msg: data.msg });
  });

  socket.emit('loggedIn', {
    users: users.map(s => s.username),
    messages: messages
  })

  socket.on('newUser', username => {
    console.log(`${username} has joined`)
    // socket.username = username
    // socket.id = socket.id
    users.push({
      id: socket.id,
      username: username
    })

    let len = users.length;
    len--;

    io.emit('userOnline', users, users[len].id)
  })

  socket.on('msg', data => {

    let message = {
      msg: data.msg,
      name: data.name
    }

    messages.push(message)

    console.log(data)

    socket.broadcast.to(data.toid).emit('sendMsg', message)
  })

  socket.on('disconnect', () => {
    console.log(`${socket.username} has left`)

    for(let i=0; i < users.length; i++){
                    
        if(users[i].id === socket.id){
            users.splice(i,1); 
        }
    }

    io.emit('exit', users); 
  })

  // socket.broadcast.emit('message', 'A new user has joined the chat')

  // socket.on('disconnect', () => {
  //   io.emit('message', 'A user has left the chat')
  // })

})

Проблема в том, что я могу заставить его отправлять сообщение другому человеку, однако все вошедшие в систему пользователи видят сообщение, и тогда я не уверен, как я могу сделать это безопасным , очевидно, что пользователь должен войти в систему, чтобы отправить сообщение, но теоретически они могут изменить свой UUID на чужой, чтобы подделать сообщение, исходящее от этого человека.

Есть какой-нибудь совет? Фрагменты кода будут использоваться для обмена личными сообщениями с JWT и Socket.io?

...