সকেট.আইও এবং সেশন?


96

আমি এক্সপ্রেস ফ্রেমওয়ার্ক ব্যবহার করছি। আমি সকেট.ইও থেকে সেশন ডেটাতে পৌঁছাতে চাই। আমি ক্লায়েন্ট.লিস্টেনার.সর্ভার.ডিমনামিকভিউহেল্পার্স ডেটা সহ এক্সপ্রেস ডায়নামিকহেলপার্স চেষ্টা করেছি, তবে আমি সেশন ডেটা পেতে পারি না। এটি করার কোন সহজ পথ আছে কি? দয়া করে কোডটি দেখুন

app.listen(3000);

var io = require('socket.io');
var io = io.listen(app);

io.on('connection', function(client){
    // I want to use session data here
    client.on('message', function(message){
        // or here
    });
    client.on('disconnect', function(){
        // or here
    }); 
});

5
বা এই খুব সুন্দর পোস্টটি ব্যবহার করতে পারেন: danielbaulig.de/sket-ioexpress
ফ্যাবিয়ানো সোরিয়ানী

4
@ ফ্যাবিয়ানোএস - আর কাজ করবে না - সংযোগ আর পার্সকুকি পদ্ধতি সরবরাহ করে না যার উপর এটি নির্ভর করে।
দ্য ক্রিক

4
@UpTheCreek - যেহেতু সংযোগের ফলে পার্সকুকি পদ্ধতি আর ব্যবহার করা হয় না, এটি কীভাবে সম্ভব?
আস্ট-

@ অস্ট - ভাল প্রশ্ন, এখন সেরা পন্থাটি কী তা আমি জানি না। এটি সত্যিই একটি জগাখিচু আইএমও। বিরক্তিকরভাবে বেশিরভাগ কাজের আলোচনার বিষয়গুলিও সকেট.ইও (কেন সকলেই সকেট.ইও ব্যবহার করছে না) তে নিবদ্ধ থাকে। এখানে এখন একটি পার্সসাইনড কুকি ফাংশন রয়েছে, তবে এটিও ব্যক্তিগত, তাই এটির পরিবর্তনগুলিও ভেঙে যাওয়ার ঝুঁকি রয়েছে।
আপড্রিচ

4
: Socket.IO (1.x) এবং এক্সপ্রেস (4.x) এর নতুন সংস্করণে এই তাই প্রশ্ন পরীক্ষা stackoverflow.com/questions/25532692/...
pootzko

উত্তর:


68

এটি ফ্ল্যাশকেট পরিবহনের উপর দিয়ে যাওয়া সকেটের জন্য কাজ করবে না (এটি সার্ভারকে প্রয়োজনীয় কুকিজ প্রেরণ করে না) তবে এটি নির্ভরযোগ্যভাবে অন্য সব কিছুর জন্য কাজ করে। আমি কেবল আমার কোডে ফ্ল্যাশকেট পরিবহন অক্ষম করি।

এটিকে কাজ করতে, এক্সপ্রেস / সংযোগের দিক দিয়ে আমি স্পষ্টভাবে সেশন স্টোরটি সংজ্ঞায়িত করি যাতে আমি এটি সকেটের অভ্যন্তরে ব্যবহার করতে পারি:

MemoryStore = require('connect/middleware/session/memory'),
var session_store = new MemoryStore();
app.configure(function () {
  app.use(express.session({ store: session_store }));
});

তারপরে আমার সকেট কোডের অভ্যন্তরে আমি সংযোগের কাঠামোটি অন্তর্ভুক্ত করছি যাতে আমি কুকিগুলি থেকে সংযোগ.সাইড পুনরুদ্ধার করতে এর কুকি পার্সিং ব্যবহার করতে পারি। আমি তখন সেশন স্টোরটিতে সেশনটি সন্ধান করি যা এর সাথে সংযুক্ত রয়েছে s এসিড:

var connect = require('connect');
io.on('connection', function(socket_client) {
  var cookie_string = socket_client.request.headers.cookie;
  var parsed_cookies = connect.utils.parseCookie(cookie_string);
  var connect_sid = parsed_cookies['connect.sid'];
  if (connect_sid) {
    session_store.get(connect_sid, function (error, session) {
      //HOORAY NOW YOU'VE GOT THE SESSION OBJECT!!!!
    });
  }
});

তারপরে আপনি প্রয়োজন অনুযায়ী সেশনটি ব্যবহার করতে পারেন।


4
দেখে মনে হচ্ছে সকেট_স্লায়েন্ট.আরকেস্ট সকেট.ইও-নোডের সর্বশেষ সংস্করণে সরানো হয়েছে
আর্ট

6
সাবধান থাকুন ... এখন এটি করার জন্য নতুন কনভেনশন রয়েছে ... আমি পরিবর্তে সকেট.আইও প্রমাণীকরণ ব্যবহার করার পরামর্শ দেব।
@

4
দুর্ভাগ্যক্রমে এই আর কাজ করবে না - পার্সকুকি আর সংযুক্ত ব্যবহারের অংশ নয়। স্পষ্টতই এটি কখনই জনসাধারণের API এর অংশ ছিল না। একটি অগোছালো বিকল্প রয়েছে - পার্সসাইনডকুকি, তবে এটি ব্যক্তিগতও, তাই আমার ধারণা
এটিরও

এখন যে আমি এটি সম্পর্কে চিন্তাভাবনা করছি .... কেন কেবল কুকিজের জন্য দোকান এবং সকেটের জন্য স্টোরকে একই দোকানে সেট করবেন না?
জেমস

34

সকেট.আইও-সেশন মডিউল সমাধান ক্লায়েন্ট (স্ক্রিপ্টিং) স্তরে সেশন আইডি প্রকাশ করে অ্যাপ্লিকেশনটিকে এক্সএসএস আক্রমণে উন্মুক্ত করে।

পরিবর্তে এই সমাধানটি পরীক্ষা করুন (সকেট.আইও> = v0.7 এর জন্য)। ডক্স এখানে দেখুন ।


4
@ জেফার - সেই দ্বিতীয় সমাধানটি সংযোগের বর্তমান সংস্করণটির সাথে আর কাজ করবে না।
আপক্রিক

4
-1 socket.ioহ'ল সেশন আইডিটি প্রকাশ করা হচ্ছে, সেই মডিউলটি নয়। এটি কোনও বড় বিষয় নয় যেহেতু সেশন আইডি কোনওভাবেই কোনও কুকিতে ক্লায়েন্টের পাশে সঞ্চিত আছে ... এছাড়াও সেই টিউটোরিয়ালটি এক্সপ্রেসের সর্বশেষ সংস্করণে কাজ করে না।
অস্ট

4
আপনার সমাধান লিঙ্কটি কেবল socket.ioগিথুব পৃষ্ঠায় পুনঃনির্দেশ করে ..?
টিজে

8

আমি পুরোপুরি চাকা পুনরায় উদ্ভাবন না করার পরামর্শ দিই। আপনার প্রয়োজনীয় সরঞ্জামগুলি ইতিমধ্যে একটি এনপিএম প্যাকেজ I আমি মনে করি এটি আপনার প্রয়োজন: সেশন.সকেট.ইও আমি এই দিনগুলিতে এটি ব্যবহার করছি এবং এটি অনুমান করা খুব সহায়ক হবে !! এক্সপ্রেস-সেশনটি সকেট.আইও লেয়ারের সাথে সংযুক্ত করার ফলে অনেক সুবিধা হবে!


6
এখানে একটি আপডেট করা মডিউল রয়েছে যা সকেট.আইও-এক্সপ্রেস-সেশনগুলি সকেট.ইও> = 1.0 গিথুব
blnc

4

সম্পাদনা: কিছু মডিউল চেষ্টা করে না যা কাজ করে নি, আমি আসলে গিয়েছিলাম এবং এটি করার জন্য আমার নিজের লাইব্রেরি লিখেছি। নির্লজ্জ প্লাগ: https://github.com/aviddiviner/Sket.IO-sessions এ এটি পরীক্ষা করে দেখুন । আমি আমার পুরানো পোস্টটি নীচে historicalতিহাসিক উদ্দেশ্যে ছেড়ে দেব:


আমি বাইপাস না করেও এই কাজ পেয়েছিলাম বেশ সুন্দরভাবে flashsocket অনুযায়ী পরিবহন pr0zac উপরে এর সমাধান। আমি সকেট.আইওর সাথে এক্সপ্রেসও ব্যবহার করছি। এখানে কিভাবে।

প্রথমে সেশন আইডিটি ভিউতে পাস করুন:

app.get('/', function(req,res){
  res.render('index.ejs', {
    locals: { 
      connect_sid: req.sessionID
      // ...
    }
  });
});

তারপরে আপনার দৃষ্টিতে, এটি সকেটের সাথে যুক্ত করুন Iআই ক্লায়েন্ট-সাইড:

<script>
  var sid = '<%= connect_sid %>';
  var socket = new io.Socket();
  socket.connect();
</script>
<input type="button" value="Ping" onclick="socket.send({sid:sid, msg:'ping'});"/>

তারপরে আপনার সার্ভার-সাইড সকেটে.আইও শ্রোতা, এটিকে তুলে নেবেন এবং সেশন ডেটা পড়ুন / লিখুন:

var socket = io.listen(app);
socket.on('connection', function(client){
  client.on('message', function(message){
    session_store.get(message.sid, function(error, session){
      session.pings = session.pings + 1 || 1;
      client.send("You have made " + session.pings + " pings.");
      session_store.set(message.sid, session);  // Save the session
    });
  });
});

আমার ক্ষেত্রে, লাইব্রেরিটি session_storeব্যবহার করে আমার রেডিস redis-connect

var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));

আশা করি এটি গুগল অনুসন্ধান করার সময় এই পোস্টটি সন্ধানকারী কাউকে সহায়তা করেছে (যেমন আমি করেছি;)


8
ক্লায়েন্ট এইচটিএমএলে আপনার সেশন আইডি স্থাপন করা কোনও সুরক্ষা দৃষ্টিকোণ থেকে ভাল ধারণা নয় ...
আপড্রিউক

4
সেশন আইডি যখন স্থানীয় কুকিতে ইতিমধ্যে সঞ্চিত থাকে তখন কেন এইচটিএমএলটিতে সেশন আইডি লাগানো হয়?
গাভিন

4
কারণ এইচটিটিপিওনলি কুকি হিসাবে সেট করার সময় জাভাস্ক্রিপ্ট থেকে কুকিজ অ্যাক্সেস করা যায় না। এইচটিএমএলে সেশন.সিড স্থাপন করে আপনি আক্রমণকারীকে ডিওমে যা যা প্রয়োজন তার সবই দেন।
রোচাল

3

এটি দেখুন: সকেট.আইও প্রমাণীকরণ

আমি প্রস্তাব দিয়েছি যে এটির মাধ্যমে client.request...বা client.listener...এটিকে সরাসরি সংযুক্ত না করা clientএবং সর্বদা লগ-ইন থাকা সর্বশেষ ব্যবহারকারীকে নির্দেশ করার মতো কোনও জিনিস আনার পরামর্শ নেই !


2

পরীক্ষা করে দেখুন Socket.IO সংযোগ

সকেটের চারপাশে ওয়েবস্কট মিডলওয়্যার র‍্যাপারটি সংযুক্ত করুন Iআইও নোড https://github.com/bnoguchi/Sket.IO- সংযোগ

এটি আপনাকে সকেট.আইও অনুরোধ (গুলি) সকেটকে ধাক্কা দেওয়ার অনুমতি দেবে, সকেট.আইও ইভেন্ট হ্যান্ডলারদের সাথে সেশন, কুকিজ এবং আরও অ্যাক্সেস দেওয়ার মাধ্যমে এক্সপ্রেস / কানেক্ট মিডলওয়্যার স্ট্যাকটি পরিচালনা করার আগে। যদিও, আমি নিশ্চিত নই যে এটি সকেট.আইওর সমস্ত পরিবহণের সাথে কাজ করে।


দুর্ভাগ্যবশত মডিউল এখনও socket.io এর v0.6 ব্যবহার করছে যা
fent

2

আপনি এক্সপ্রেস-সকেট.আইও-সেশনটি ব্যবহার করতে পারেন

কুকি-ভিত্তিক এক্সপ্রেস-সেশন মিডলওয়্যারটি সকেট.ইওয়ের সাথে ভাগ করুন। এক্সপ্রেস> 4.0.0 এবং সকেট.ইও> 1.0.0 এর সাথে কাজ করে এবং পিছনে সামঞ্জস্যপূর্ণ হবে না।

আমার জন্য কাজ করেছেন !!


আরে ফ্রন্ট-এন্ডে আপনি কীভাবে সেশনটির মানগুলি ব্যবহার করবেন? এগুলি এনপিএম ডক্সে দেখতে পাচ্ছি না।
হরি রাম

1

আপনি এটি দেখতে পারেন: https://github.com/bmeck/session-web-sockets

অথবা বিকল্পভাবে আপনি ব্যবহার করতে পারেন:

io.on('connection', function(client) { 
  var session = client.listener.server.viewHelpers; 
  // use session here 
});

আশাকরি এটা সাহায্য করবে.


আমি সেশন-ওয়েব-সকেটগুলি জানি তবে আমি এর জন্য কোনও লাইব্রেরি ব্যবহার করতে চাই না, আমি একটি সহজ সমাধান খুঁজছি। আমি ক্লায়েন্ট.লিস্টনার.সভার.ভিউ হেল্পার চেষ্টা করেছি; তবে এটি ফেরত:
f

4
যদিও এটি প্রথমে কাজ করে বলে মনে হচ্ছে, এটি জাতিদের অবস্থার দিকে নিয়ে যায়। আমি আপনাকে এটি সম্পূর্ণ এড়ানোর পরামর্শ দিই।
শ্রীপদ ​​কৃষ্ণ

1

আমি নিশ্চিত না যে আমি এটি সঠিকভাবে করছি। https://github.com/LearnBoost/sket.io/wiki/Authorizing

হ্যান্ডশেক ডেটা দিয়ে, আপনি কুকিগুলিতে অ্যাক্সেস করতে পারবেন। এবং কুকিগুলিতে, আপনি সংযোগ.সাইড ধরতে পারেন যা প্রতিটি ক্লায়েন্টের সেশন আইডি। এবং তারপরে ডাটাবেস থেকে সেশন ডেটা পেতে কানেক্ট.সিড ব্যবহার করুন (আমি ধরে নিচ্ছি আপনি রেডিসটোর ব্যবহার করছেন)


এটি ঠিক যাওয়ার উপায় তবে আপনার দুর্দান্ত নয় যাতে আপনি স্ট্যাক ওভারফ্লো পয়েন্টগুলি পান না। github.com/tcr/sket.io-session এবং github.com/functioncallback/session.sket.io আমি প্রথমটি এর ক্লিনারটি আরও ভাল পছন্দ করি। দ্বিতীয়টি কিছুটা ভাল ডকুমেন্টেড।
জেমস

@ টিজে আমি এতে দুঃখিত তবে আপনি কি বুঝতে পারছেন যে উত্তরটি ২ বছর আগে ছিল? এবং এটি সম্ভবত এখন কাজ করবে না
ট্যান Nguyen

@ ট্যানগুইইন আমি জানি, সে কারণেই আমি আপনাকে অবহিত করেছি যাতে আপনি লোকদের মৃত লিঙ্কগুলিতে ইঙ্গিত করার চেয়ে প্রয়োজনীয় উত্তরটি আপডেট করতে পারেন
TJ

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