JWT kullanarak soket io bağlantılarını doğrulama


106

Socket.io bağlantısının kimliğini nasıl doğrulayabilirim? Uygulamam bir belirteç almak için başka bir sunucudan (python) bir oturum açma uç noktası kullanıyor, bir kullanıcı düğüm tarafında bir soket bağlantısı açtığında bu belirteci nasıl kullanabilirim?

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

Ve müşteri tarafı:

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

Belirteç python'da oluşturulmuşsa:

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

Düğümdeki bir soket bağlantısının kimliğini doğrulamak için bu belirteci nasıl kullanabilirim?

Yanıtlar:


227

Jetonun başka bir sunucuda yaratılmış olması önemli değildir. Doğru gizli anahtara ve algoritmaya sahipseniz yine de doğrulayabilirsiniz.

jsonwebtokenModül ile uygulama

müşteri

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

Sunucu

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-jwtModül ile uygulama

Bu modül, kimlik doğrulamayı hem istemci hem de sunucu tarafında çok daha kolay hale getirir. Sadece örneklerine bakın.

müşteri

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

Sunucu

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

Sokete gelen bir bağlantı olmasa da bir sorunla karşı karşıyayım, soket sunucusunu çalıştırdığımda hala eski belirteci var. garip değil mi ?
Lamour

İstemci api'de io.connect ile mevcut seçenekler nelerdir
rocketspacer

2
Kullanıcının yetkisiz olması ve ilk denemede sırrı olmaması durumunda sunucuya nasıl yeniden bağlanırsınız?
sznrbrt

9
merhaba, sormam gerekiyor, token bağlantıda veya her yayma olayında bir kez gerekli mi?
Krunal Limbad

2
Alanlar için Cannot read property 'on' of undefined; Sadece kaldırmak socketdan function(socket).
Thomas Orlita

-28

bu url'yi kullanabilirsiniz.

var socket = SocketIOClient(socketURL: URL(string: "http://00.00.00.00:port")!, config: SocketIOClientConfiguration(arrayLiteral: SocketIOClientOption.connectParams(["token": "your secret key"])))

9
Hızlı bir dil yazdığınızı belirtmelisiniz. Diğer insanlar bunu bilmiyor.
Kılıç Jason

6
Bu cevabı açıklamanız gerekir, aksi takdirde bu herkes için yararlı değildir. Ayrıca hızlı bir dilde yazılmışsa, lütfen cevabınızda bunu belirtin
Freddy Daniel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.