การตรวจสอบการเชื่อมต่อซ็อกเก็ต io โดยใช้ JWT


111

ฉันจะตรวจสอบการเชื่อมต่อ socket.io ได้อย่างไร? แอปพลิเคชันของฉันใช้ปลายทางการเข้าสู่ระบบจากเซิร์ฟเวอร์อื่น (python) เพื่อรับโทเค็นฉันจะใช้โทเค็นนั้นได้อย่างไรเมื่อใดก็ตามที่ผู้ใช้เปิดการเชื่อมต่อซ็อกเก็ตที่ฝั่งโหนด

io.on('connection', function(socket) {
    socket.on('message', function(message) {
        io.emit('message', message);
    });
});

และฝั่งไคลเอ็นต์:

var token = sessionStorage.token;
var socket = io.connect('http://localhost:3000', {
    query: 'token=' + token
});

หากโทเค็นถูกสร้างขึ้นใน python:

token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')

ฉันจะใช้โทเค็นนี้เพื่อตรวจสอบการเชื่อมต่อซ็อกเก็ตในโหนดได้อย่างไร

คำตอบ:


238

ไม่สำคัญว่าโทเค็นถูกสร้างขึ้นบนเซิร์ฟเวอร์อื่นหรือไม่ คุณยังคงสามารถยืนยันได้หากคุณมีคีย์ลับและอัลกอริทึมที่ถูกต้อง

การใช้งานกับjsonwebtokenโมดูล

ลูกค้า

const {token} = sessionStorage;
const socket = io.connect('http://localhost:3000', {
  query: {token}
});

เซิร์ฟเวอร์

const io = require('socket.io')();
const jwt = require('jsonwebtoken');

io.use(function(socket, next){
  if (socket.handshake.query && socket.handshake.query.token){
    jwt.verify(socket.handshake.query.token, 'SECRET_KEY', function(err, decoded) {
      if (err) return next(new Error('Authentication error'));
      socket.decoded = decoded;
      next();
    });
  }
  else {
    next(new Error('Authentication error'));
  }    
})
.on('connection', function(socket) {
    // Connection now authenticated to receive further events

    socket.on('message', function(message) {
        io.emit('message', message);
    });
});

การใช้งานกับsocketio-jwtโมดูล

โมดูลนี้ทำให้การพิสูจน์ตัวตนง่ายขึ้นมากทั้งในฝั่งไคลเอ็นต์และเซิร์ฟเวอร์ เพียงตรวจสอบตัวอย่างของพวกเขา

ลูกค้า

const {token} = sessionStorage;
const socket = io.connect('http://localhost:3000');
socket.on('connect', function (socket) {
  socket
    .on('authenticated', function () {
      //do other things
    })
    .emit('authenticate', {token}); //send the jwt
});

เซิร์ฟเวอร์

const io = require('socket.io')();
const socketioJwt = require('socketio-jwt');

io.sockets
  .on('connection', socketioJwt.authorize({
    secret: 'SECRET_KEY',
    timeout: 15000 // 15 seconds to send the authentication message
  })).on('authenticated', function(socket) {
    //this socket is authenticated, we are good to handle more events from it.
    console.log(`Hello! ${socket.decoded_token.name}`);
  });

ฉันกำลังประสบปัญหาแม้ว่าจะไม่มีการเชื่อมต่อขาเข้ากับซ็อกเก็ต แต่เมื่อฉันเปิดเซิร์ฟเวอร์ซ็อกเก็ต แต่ก็ยังมีโทเค็นเก่าอยู่ มันแปลกมั้ย?
Lamour

ตัวเลือกที่ใช้ได้กับ io.connect ในไคลเอนต์ api มีอะไรบ้าง
rocketspacer

2
คุณจะเชื่อมต่อกับเซิร์ฟเวอร์ใหม่ได้อย่างไรในกรณีที่ผู้ใช้เดิมไม่ได้รับอนุญาตและไม่มีความลับในการลองครั้งแรก?
sznrbrt

10
สวัสดีฉันต้องถามว่าโทเค็นจำเป็นสำหรับการเชื่อมต่อครั้งเดียวหรือในทุกเหตุการณ์ที่เปล่งออกมา?
Krunal Limbad

3
สำหรับทุกคนที่ได้รับCannot read property 'on' of undefined; เพียงแค่ลบsocketจากfunction(socket).
Thomas Orlita
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.