JWT का उपयोग करके सॉकेट io कनेक्शन को प्रमाणित करना


106

मैं एक सॉकेट.आईओ कनेक्शन को कैसे प्रमाणित कर सकता हूं? मेरा एप्लिकेशन टोकन प्राप्त करने के लिए किसी अन्य सर्वर (अजगर) से लॉगिन एंडपॉइंट का उपयोग करता है, मैं उस टोकन का उपयोग कैसे कर सकता हूं जब कोई उपयोगकर्ता नोड पक्ष पर सॉकेट कनेक्शन खोलता है?

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

यदि पायथन में टोकन बनाया गया है:

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

नोड में सॉकेट कनेक्शन को प्रमाणित करने के लिए मैं इस टोकन का उपयोग कैसे कर सकता हूं?

जवाबों:


226

इससे कोई फर्क नहीं पड़ता कि टोकन किसी अन्य सर्वर पर बनाया गया था। आप अभी भी इसे सत्यापित कर सकते हैं यदि आपके पास सही गुप्त कुंजी और एल्गोरिथ्म है।

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

मुझे एक समस्या का सामना करना पड़ रहा है, भले ही सॉकेट के लिए कोई आवक कनेक्शन नहीं है, जब मैंने सॉकेट सर्वर को निकाल दिया तो यह अभी भी पुराना टोकन है। क्या वोह अजीब है ?
लामौर

ग्राहक एपी में io.connect के साथ उपलब्ध विकल्प क्या हैं
रॉकेट्सपेसर

2
यदि उपयोगकर्ता मूल रूप से अनधिकृत था और पहली कोशिश में यह गुप्त नहीं था तो आप सर्वर से कैसे जुड़ेंगे?
sznrbrt 20

9
हैलो, मुझे यह पूछने की ज़रूरत है, कनेक्शन पर या हर ईवेंट पर एक बार टोकन की आवश्यकता है?
क्रुणाल लिम्बड

2
किसी के लिए भी Cannot read property 'on' of undefined; बस को दूर socketसे function(socket)
थॉमस ऑरलिटा

-28

आप इस url का उपयोग कर सकते हैं।

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

9
आपको यह बताना चाहिए कि आप एक स्विफ्ट भाषा लिख ​​रहे हैं। अन्य लोगों को अभी पता नहीं है।
स्वार्ड जेसन

6
आपको इस उत्तर को समझाने की आवश्यकता है अन्यथा यह सभी के लिए उपयोगी नहीं है। इसके अलावा अगर यह तेज भाषा में लिखा गया है तो कृपया अपने उत्तर में उल्लेख करें
फ्रेडी डैनियल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.