2013-10-01 13 views
26

के साथ प्राधिकरण और हैंडशेकिंग मैं सोच रहा हूं कि प्रमाणीकरण का मुख्य कार्य और सॉकेट.आईओ में हैंडशेक क्या है। मैं पहले से ही GitHub पर उनके विकि और authorizing guide पढ़ा है लेकिन मैं अभी भी निम्न समझ में नहीं आता:सॉकेट.आईओ

  1. कैसे Socket.io में प्राधिकरण काम करता है?
  2. सॉकेट.आईओ में हैंडशेक क्या है?
  3. क्या मैं handshakeData ऑब्जेक्ट में कुछ भी जोड़ सकता हूं?

मुझे आशा है कि आप मेरे प्रश्न का उत्तर दे सकते हैं। धन्यवाद।

उत्तर

51

संपादित करें: सॉकेट.आईओ 1.0 में, मिडलवेयर अब उपयोग किया जाता है। प्राधिकरण इसलिए की तरह किया जा सकता है:

io.use(function(socket, next) { 
    var handshake = socket.request; 
    next(); 
}); 

अगर तुम सिर्फ next() कॉलबैक करने के लिए एक त्रुटि वस्तु पारित सॉकेट अस्वीकार करने के लिए जरूरत के लिए, थे। एक ही बात नामस्थान के साथ किया जा सकता है:

Socket.IO में
io.of('/namespace').use(function(socket, next) { 
    var handshake = socket.request; 
    next(); 
}); 

प्राधिकरण एक समारोह जो एक बूलियन कि एक कॉलबैक से पारित हो जाता है में निर्णय लिया जाता है के माध्यम से चलाया जाता है। यह समारोह हर बार एक कनेक्शन एक हाथ मिलाना प्रयास करता है चलाता है, और यह कि यह क्या लगता है की तरह है:

io.set('authorization', function (handshake, callback) { 
    callback(null, true); 
}); 

समारोह callback() दो पैरामीटर स्वीकार करता है। पहला त्रुटि कारण है, यदि कोई है, और दूसरा पैरामीटर बुलियन है जो यह तय करता है कि कोई क्लाइंट कनेक्ट हो सकता है या नहीं। डिफ़ॉल्ट रूप से कोई प्रमाणीकरण नहीं होता है, इसलिए परिदृश्य ऊपर दिए गए कोड नमूने में दिखाया गया है, जहां कनेक्ट होने वाली सॉकेट को true के साथ पारित होने की अनुमति है।

सॉकेट.आईओ में हैंडशेक किसी भी अन्य सूचना प्रौद्योगिकी से संबंधित हैंडशेक की तरह है। यह वार्ता की प्रक्रिया है, जो सॉकेट.आईओ के मामले में, यह तय करती है कि कोई क्लाइंट कनेक्ट हो सकता है, और यदि नहीं, तो कनेक्शन से इंकार कर देता है। हैंडशेक या तो एक्सएचआर या जेएसओएनपी अनुरोध के साथ शुरू किया गया है, और जब कोई प्राधिकरण निर्दिष्ट नहीं किया जाता है, तो यह बहुत कुछ नहीं करता है, लेकिन handshake डेटा ऑब्जेक्ट में पारित डेटा में सहायक हो सकता है।

अपने अंतिम प्रश्न का उत्तर देने के लिए, हाँ, आप handshake ऑब्जेक्ट में कुछ भी जोड़ सकते हैं।

io.set('authorization', function (handshake, callback) { 
    handshake.foo = 'bar'; 
    callback(null, true); 
}); 

io.sockets.on('connection', function(socket) { 
    console.log(socket.handshake.foo); // bar 
}); 

यह बहुत उपयोगी है क्योंकि आप सॉकेट आधारित गुण स्टोर कर सकते हैं: वस्तु socket.handshake वस्तु है, जो आप इस तरह काम करने के लिए अनुमति देता है के लिए एक ही चर संदर्भ है। इसके लिए एक आम उपयोग एक्सप्रेस फ्रेमवर्क के साथ है, जहां कोई सॉकेट.आईओ द्वारा पारित कुकीज़ के आधार पर सत्र आईडी की पहचान कर सकता है, जो तब एक मिलान सत्र की पहचान की जा सकती है।

+0

धन्यवाद भाई। यह वह उत्तर है जिसे मैं ढूंढ रहा हूं। :) –

+4

यह अधिक पसंद के लायक है। सादा तथ्य यह है कि हैंडशेक सॉकेट के माध्यम से सॉकेट.handshake के माध्यम से उपलब्ध है, इतनी दुखी उपयोगी है। – Deminetix

+3

अगर मैं 'अगली (नई त्रुटि (' निषिद्ध ')) कहता हूं; '- क्लाइंट में मेरे कनेक्शन से इनकार करने के बारे में मुझे जानकारी कैसे प्राप्त हो सकती है? मैं मिडलवेयर से .emit() नहीं कर सकता क्योंकि 'अगली (नई त्रुटि (' '))' आगे संचार से इनकार करती है। – cadavre

2

अभी मैं इस सरल विधि का उपयोग कर रहा:

io.set('authorization', function (handshakeData, accept) { 
    var domain = handshakeData.headers.referer.replace('http://','').replace('https://','').split(/[/?#]/)[0]; 
    if('myDomain.com'==domain) 
    accept(null, true); 
    else 
    return accept('Deny', false); 
}); 
9

Socket.io 1.0 के बाद से, हालांकि वहां पीछे की ओर है संगतता यह "कब उपयोग करने के लिए सिफारिश की है।क्रम में उपयोग() ", अपने तदर्थ मिडलवेयर जोड़ने के लिए तो नोड सर्वर साइड में:

io.use(function(socket, next){ 
    var joinServerParameters = JSON.parse(socket.handshake.query.joinServerParameters); 
    if (joinServerParameters.token == "xxx"){ 
    next();   
    } else { 
    //next(new Error('Authentication error'));     
    } 
    return;  
}); 

और क्लाइंट की तरफ, हाथ मिलाना करने के लिए अपनी खुद की विशेषता जोड़ने के लिए है, यह इस तरह दिखेगा:

var joinServerParameters = { token: "xxx" };  
var socket = io.connect('url' , {query: 'joinServerParameters=' + JSON.stringify(joinServerParameters) }); 
0

मुझे पता है कि बहुत देर हो चुकी है लेकिन मैं जानकारी मैं कहाँ हाथ मिलाना प्राधिकरण के बारे में बहुत अच्छा लेख मिला socket.io का उपयोग कर जोड़ना चाहते हैं।

socket.io authorization

संबंधित मुद्दे