JWT ব্যবহার করে সকেট আইও সংযোগগুলি প্রমাণীকরণ করা হচ্ছে


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')

নোডে সকেট সংযোগটি প্রমাণ করার জন্য আমি কীভাবে এই টোকেনটি ব্যবহার করতে পারি?

উত্তর:


227

টোকেনটি অন্য সার্ভারে তৈরি করা হয়েছিল কিনা তা বিবেচ্য নয়। আপনার যদি সঠিক গোপন কী এবং অ্যালগরিদম থাকে তবে আপনি এটি যাচাই করতে পারেন।

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

সকেটের সাথে আগত সংযোগ না থাকা সত্ত্বেও আমি একটি সমস্যার মুখোমুখি হয়েছি, আমি যখন সকেট সার্ভারটি চালিত করেছি তখনও এটিতে পুরানো টোকেন রয়েছে। কি অদ্ভুত?
ল্যামোর

ক্লায়েন্ট এপিআই
সংযোগের

4
আপনি যদি সার্ভারের সাথে পুনরায় সংযোগ স্থাপন করবেন তবে যদি ব্যবহারকারীটি প্রাথমিকভাবে অননুমোদিত ছিল এবং এটির প্রথম চেষ্টাটিতে গোপনীয়তা নেই?
sznrbrt

9
হ্যালো, আমাকে জিজ্ঞাসা করা দরকার, সংযোগে বা প্রতিটি নির্গমন ইভেন্টে টোকন একবারে প্রয়োজন?
ক্রুনাল লিমবাদ

4
যে কেউ পাবার জন্য Cannot read property 'on' of undefined; শুধু socketথেকে অপসারণ function(socket)
থমাস অরলিতা

-28

আপনি এই ইউআরএল ব্যবহার করতে পারেন।

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

9
আপনি উল্লেখ করতে হবে যে আপনি একটি দ্রুত ভাষা লিখছেন। অন্যান্য লোকেরা কেবল এটি জানেন না।
তরোয়াল জেসন

6
আপনার এই উত্তরটি ব্যাখ্যা করতে হবে অন্যথায় এটি সবার পক্ষে কার্যকর নয়। এছাড়াও যদি এটি দ্রুত ভাষায় লেখা হয় তবে দয়া করে আপনার উত্তরে এটি উল্লেখ করুন
ফ্রেডি ড্যানিয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.