2012-01-06 15 views
14

मैं एक छोटे मल्टीप्लेयर गेम पर काम कर रहा हूं। मैं प्रमाणीकरण शुरू करना चाहता हूं। मैं Node.js और Socket.io का उपयोग कर रहा हूँ।socket.io प्रमाणीकरण

जब उपयोगकर्ता मुख्य पृष्ठ आता है - मैं चाहता हूं कि वे इस गेम में शामिल हों कि वे लॉग इन हैं या नहीं - लेकिन वे इसके भीतर कुछ भी करने में असमर्थ होंगे (केवल देखें)।

मैं पहले से ही खुले सॉकेट पर उपयोगकर्ता को प्रमाणित करने के बारे में कैसे जा सकता हूं?

क्या मैं साइट छोड़कर वापस आ गया और फिर भी प्रमाणीकरण बनाए रख सकता हूं? क्या आप एक वेब सॉकेट के माध्यम से एक कुकी पास कर सकते हैं?

संपादित

मेरे सवाल का आगे करने के लिए। मेरे पास संभावित विचारों में से एक है वेबस्केट कनेक्शन प्रदान करना, फिर जब वे लॉगिन करने का प्रयास करते हैं, तो यह वेबसाईट पर एक संदेश के रूप में उपयोगकर्ता नाम और पासवर्ड पास करता है।

client.on('onLogin', loginfunction); 

मैं तो, उपयोगकर्ता नाम और पासवर्ड ले सकता है, डेटाबेस के खिलाफ जांच तो सॉकेट का सत्र आईडी लेने के लिए और इसे कहीं से पारित कहना है कि सत्र है कि उपयोगकर्ता के लिए प्रमाणीकृत है।

क्या यह सुरक्षित है? क्या मैं अभी भी सॉकेट पर एक कुकी लागू कर सकता हूं ताकि वे वापस आ सकें? Socket.io के भीतर कोई तरीका है यह बताते हुए कि सॉकेट अब प्राप्त प्रत्येक संदेश को मैन्युअल रूप से जांचने के बजाय प्रमाणीकृत है?

चीयर्स

+0

वहाँ एक रास्ता के रूप में socket.io भीतर प्रमाणीकृत के बाद कनेक्शन स्थापित हो जाने और पूर्ण हाथ मिलाना संबंध स्थापित करने की शायद है? मौजूदा कनेक्शन के लिए तैयार होने पर उपयोगकर्ता लॉगिन विवरण की आपूर्ति कर सकता है, सर्वर एक अद्वितीय सत्र आईडी को सत्यापित और वापस कर सकता है। क्लाइंट साइड जावास्क्रिप्ट भविष्य में उपयोग के लिए कुकी को सहेज सकता है। –

+0

सॉकेट.ओ सत्रों को प्रमाणीकृत करने के तरीके पर [इस आलेख] (http://www.danielbaulig.de/socket-ioexpress/) देखें। – fent

+0

हां, मैंने वास्तव में पहले से ही उस लेख को पढ़ा है। जब तक मैं कुकी को सेट करने में काफी खुश हूं, तो सॉकेट पहले से ही खुला होने पर यह उसी पृष्ठ पर लॉग इन करने की अनुमति नहीं देता है। यदि उपयोगकर्ता को कुकीज़ अक्षम कर दी गई है तो यह भी संभवतः पीड़ित है? –

उत्तर

5

यह वास्तव में बहुत कठिन नहीं है, लेकिन आप इसे गलत तरीके से पहुंचने वाले हैं।कुछ बातें:

  1. आप socket.io के साथ कुकी नहीं निर्धारित कर सकते हैं; हालांकि, आप किसी भी समय किसी भी जुड़े क्लाइंट के कुकी मान प्राप्त कर सकते हैं। कुकी सेट करने के लिए, आपको एक नई http प्रतिक्रिया भेजनी होगी, जिसका अर्थ है कि उपयोगकर्ता को पहले एक नया http अनुरोध भेजना होगा (उर्फ रीफ्रेश करें या एक नए पेज पर जाएं, जो यह आपके लिए एक संभावना नहीं है)।

  2. हां: socket.io सुरक्षित है (इस सीमा तक कि कोई भी प्रेषित डेटा हो सकता है)। उपयोगकर्ता का प्रारंभिक कनेक्शन पर,

    ऐसे एक्सप्रेस के सत्र मिडलवेयर से उत्पन्न उन के रूप में एक अद्वितीय सत्र आईडी के साथ कुकी बनाने के लिए:

जैसे, आप निम्न कार्य कर सकते हैं। आपको सत्र समाप्ति पर समाप्त होने के लिए इन्हें कॉन्फ़िगर करने की आवश्यकता होगी हालांकि (अन्यथा यह उनके ब्राउज़र को बंद करने के तुरंत बाद समाप्त हो जाएगा)।

अगला आपको कुकी सत्र आईडी स्टोर करने के लिए कोई ऑब्जेक्ट बनाना चाहिए। प्रत्येक बार जब एक नई connect.sid कुकी सेट की जाती है, तो अपने नए ऑब्जेक्ट में गलत के डिफ़ॉल्ट मान के साथ स्टोर करें (जिसका अर्थ है कि उपयोगकर्ता सत्र द्वारा प्रमाणीकृत किया गया है, लेकिन लॉगऑन द्वारा नहीं)

उपयोगकर्ता के लॉगिन पर, सॉकेट भेजें सर्वर से बाहर निकलें, जहां आप लॉगिन प्रमाण-पत्र प्रमाणित कर सकते हैं, और बाद में वर्तमान सॉकेट आईडी के लिए सत्य (लॉग इन) पढ़ने के लिए बनाए गए सत्र आईडी ऑब्जेक्ट को अपडेट कर सकते हैं।

अब, एक नया http अनुरोध प्राप्त करते समय, cookie.sid पढ़ें, और जांचें कि क्या आपके ऑब्जेक्ट में इसका मान सत्य है या नहीं।

यह निम्न कुछ ऐसा दिखाई देगा:

var express = require('express'), 
http = require('http'), 
cookie = require('cookie'); 

var app = express(); 
var server = http.createServer(app); 
var io = require('socket.io').listen(server); 


app.use(express.cookieParser()); 
app.use(express.session({ 
    secret: 'secret_pw', 
    store: sessionStore, 
    cookie: { 
     secure: true, 
     expires: new Date(Date.now() + 60 * 1000), //setting cookie to not expire on session end 
     maxAge: 60 * 1000, 
     key: 'connect.sid' 
    } 
})); 

var sessionobj = {}; //This is important; it will contain your connect.sid IDs. 

//io.set('authorization'...etc. here to authorize socket connection and ensure legitimacy 


app.get("/*", function(req, res, next){ 
    if(sessionobj[req.cookies['connect.sid']]){ 
     if(sessionobj[req.cookies['connect.sid']].login == true){ 
      //Authenticated AND Logged in 
     } 
     else{ 
      //authenticated but not logged in 
     } 
    } 
    else{ 
     //not authenticated 
    } 

}); 


io.sockets.on('connection', function(socket){ 
    sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid'].login = false; 
    sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid'].socketid = socket.id; 

    socket.on('login', function(data){ 
     //DB Call, where you authenticate login 
     //on callback (if login is successful): 
     sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid']] = true; 
    }); 

    socket.on('disconnect', function(data){ 
     //any cleanup actions you may want 
    }); 

}); 
+0

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन ऐसे सत्र नहीं हैं जिन्हें कभी समाप्त नहीं किया जाता है, आमतौर पर असुरक्षित माना जाता है – brthornbury

+0

@Mozoby मेरा कोड कुकी को निश्चित समय बीतने के बाद समाप्त होने के लिए सेट कर रहा है - यह अनिश्चित नहीं है। मैंने ऐसा इसलिए किया क्योंकि मूल प्रश्न यह इंगित करता था कि लौटने वाले उपयोगकर्ताओं को अभी भी लॉग इन होना चाहिए, जिसका अर्थ है कि मैं कुकीज को डिफ़ॉल्ट रूप से बंद करने पर कुकीज़ को समाप्त करने के लिए नहीं छोड़ सकता। – Ari

2

क्रिस, मैं नहीं जवाब देने के लिए के बाद से मैं socket.io पर एक विशेषज्ञ नहीं हूँ में सक्षम हो जाएगा, लेकिन मैं शायद एक और दिशा आप मदद कर सकते हैं आप बात करने के लिए कोशिश कर सकते हैं - और कुछ विकास समय ले लो।

लेकिन सबसे पहले, एक अस्वीकरण: मैं Realtime.co के लिए काम करता हूं और किसी भी प्रकार के विज्ञापन करने की कोशिश नहीं कर रहा हूं। मैं डेवलपर्स के साथ मिलकर काम करता हूं और मैं आपकी समस्या के लिए आउट ऑफ़ द बॉक्स समाधान प्रदान करके आपकी मदद करने की कोशिश कर रहा हूं। साथ ही, एक गेमर होने के नाते, मैं लोगों को अपने खेल बाहर करने में मदद करने की कोशिश करने से दूर नहीं रह सकता!

रीयलटाइम प्रमाणीकरण/प्राधिकरण परत का उपयोग करता है जिसमें आप चैनल को उपयोगकर्ता को पढ़ने/लिखने की अनुमति प्रदान कर सकते हैं। जब उपयोगकर्ता वेबसाइट में प्रवेश करते हैं तो आप उन्हें गेम चैनल को केवल अनुमतियां पढ़ सकते हैं और एक बार लॉगिन करने के बाद, आप उन्हें लिखने की अनुमति दे सकते हैं। इसे प्रमाणीकरण पोस्ट करके और सर्वर से पुनः कनेक्ट करके आसानी से किया जा सकता है (यह सब क्लाइंट पक्ष किया जा सकता है)। सुरक्षा, सुरक्षा बढ़ाने के लिए, मैं सर्वर-साइड करूँगा।

रीयलटाइम में एक नोड.जेएस एपीआई है ताकि आप आसानी से इसे अपने सर्वर से एकीकृत कर सकें। चूंकि इसमें कई अन्य प्लेटफार्मों (मोबाइल समेत) के लिए एपीआई भी हैं और वे सभी एक ही तरीके से काम करते हैं, आप वास्तव में एक ही संचार परत पर कई प्लेटफार्मों में काम कर सकते हैं, जबकि चैनलों पर पूर्ण नियंत्रण होता है।

पढ़ने के लिए धन्यवाद।

संपादित करें:

आप अधिक जानकारी के लिए यहाँ प्रलेखन पढ़ सकते हैं: http://docs.xrtml.org/