2013-01-10 24 views
22

से आरईएसटी एपीआई के लिए प्रमाणीकरण और प्रमाणीकरण मैं एक PHP आरईएसटी एपीआई का निर्माण कर रहा हूं जिसका उपयोग जावास्क्रिप्ट क्लाइंट से किया जाएगा, और कुछ मुद्दों को समझने के लिए कि चीजों को कैसे कार्यान्वित किया जाए और चीजों का उपयोग कैसे किया जाए। ऐसे कई एप्लिकेशन होंगे जो एक जावास्क्रिप्ट लाइब्रेरी का उपयोग करेंगे जो मैं अपने आवेदन के साथ बात करने और बातचीत करने के लिए विकसित हो रहा हूं। मैं उनमें से प्रत्येक को एपीआई कुंजी प्रदान करूँगा, इसलिए यह कोई मुद्दा नहीं है।जावास्क्रिप्ट क्लाइंट

जहां मैं भ्रमित हो रहा हूं यह है कि इन साइटों पर उपयोगकर्ताओं को मेरे आवेदन के लिए प्रमाणित कैसे किया जाए। ऐसा लगता है कि यह बाहरी साइट मेरे उपयोगकर्ता का खाता और पासवर्ड जानकारी स्टोर करने के लिए एक बुरा विचार है; इसलिए, मुझे लगता है कि मुझे अपनी जावास्क्रिप्ट लाइब्रेरी में एक लॉगिन विजेट शामिल होना चाहिए जो मेरे आवेदन के लिए उपयोगकर्ता की खाता जानकारी मांगे।

यदि प्रमाणीकरण सफल होता है, क्योंकि मैं एक आरईएसटी एपीआई के साथ काम कर रहा हूं, तो मुझे क्लाइंट साइड कुकी या किसी चीज़ में पुनर्प्राप्त टोकन को स्टोर करने की आवश्यकता होगी ताकि उपयोगकर्ता को मेरे एप्लिकेशन में फिर से लॉगिन करने की आवश्यकता न हो बाहरी साइट के प्रत्येक पृष्ठ पर। हालांकि, क्या होता है यदि उपयोगकर्ता बाहरी साइट से लॉग आउट करता है, और फिर कोई अन्य उपयोगकर्ता उसी ब्राउज़र से लॉग इन करता है? जहां तक ​​मेरी जावास्क्रिप्ट लाइब्रेरी का संबंध है, पुराना उपयोगकर्ता अभी भी मेरे एप्लिकेशन में लॉग इन होगा, क्योंकि कुकी/टोकन अभी तक समाप्त नहीं हुआ होगा - पिछले उपयोगकर्ता का सत्र समाप्त होने पर मैं अपनी कुकी को कैसे साफ़ कर सकता हूं? या, क्या मैं यहां सही रास्ते से पूरी तरह से बंद हूं?

तो, मैं सोच रहा हूँ प्रक्रिया की तरह कुछ होगा:

var token; // Some hashed string containing an expiration date and user id 
var apiKey = '123abc'; 

// Read the cookie and check if it already contains the token 
token = readCookie('token'); 
if (token == '') { 
    // get username and password from user through some prompt 

    var request_data = {apiKey: apiKey, user: username, pass: password}; 
    $.post('https://service.com/api/user/login', request_data, function(data) { 
     token = data; 
     document.cookie = "token=" + token; 
    }); 
} 

... 

var get_data = {apiKey: apiKey, token: token}; 
$.get('http://service.com/api/<object>', get_data, function(data) { 
    // Do something with data 
}); 

क्षमा करें, है कई यहाँ में दफन सवाल। मुझे लगता है कि मुख्य बात यह है कि अगर मैं कुकी पर टोकन संग्रहीत कर रहा हूं, तो मैं कैसे सुनिश्चित करूं कि जब उपयोगकर्ता बाहरी एप्लिकेशन से लॉग ऑफ हो जाए तो इसे साफ़ कर दिया जाए? या, अगर मुझे इसे कुकी में संग्रहीत नहीं किया जाना चाहिए, तो मैं ग्राहक को उपयोगकर्ता के राज्य के बारे में कैसे जागरूक रखूं?

+0

मुझे लगता है कि आपको अपने जेएस एपीआई में कुछ 'लॉगिन'/'लॉगआउट' विधियां प्रदान करनी चाहिए, जो आपके क्लाइंट (एप्लिकेशन में आपकी लाइब्रेरी का उपयोग करने वाली साइट) को उनके मूल लॉगिन/लॉगआउट अनुक्रम के अनुसार कॉल करना चाहिए। अगर उन्हें प्रमाणीकरण की आवश्यकता नहीं है, तो मुझे डर है कि आप इस पल को तब तक नहीं रोक सकते जब एक उपयोगकर्ता एक ही ब्राउज़र में दूसरे स्थान पर होता है (उदाहरण के लिए, कुछ इंटरनेट कैफे में)। – Stan

उत्तर

40

मैं आपको एक विश्वसनीय API को सुरक्षित करने के बारे में very good blog post पढ़ने का सुझाव देता हूं।

(मामले में है कि लिंक काम नहीं करता — यह पहले से ही एक बार मृत चला गया और मैंने पाया कि यह एक पीडीएफ इस पेज सुलभ यहाँ से प्रस्तुत करना प्रतीत हो रहा है archive.org — से प्राप्त किया गया है किया गया है:। https://www.ida.liu.se/~TDDD97/labs/hmacarticle.pdf)

नोट: मेरा उत्तर ऑफ-विषय है क्योंकि ऊपर दिए गए ब्लॉग पोस्ट में प्रदान किया गया समाधान जावास्क्रिप्ट क्लाइंट से सुरक्षित नहीं है। वास्तव में, यह सर्वर की तरफ एक आरईएसटी एपीआई को सुरक्षित करने के तरीके को समझाता है।

+6

सबसे पहले मैंने पढ़ा है कि "ओथ का उपयोग करें" के साथ निष्कर्ष निकाला नहीं गया है ... और एक बोनस समझने के लिए यह बहुत सरल है, खासकर अगर आप मूल क्रिप्टोग्राफी के बारे में कुछ ही जानते हैं। महान खोज – Kaganar

+5

यदि आप किसी जेएस क्लाइंट से एचएमएसी का उपयोग करते हैं, तो ग्राहक के पास अनुरोधों पर हस्ताक्षर करने के लिए गुप्त कुंजी होनी चाहिए, जो इसे सार्वजनिक करता है, जो इसे बेकार बनाता है। –

+0

चूंकि यह लिंक अब तक कई बार नीचे चला गया है, यह इस उत्तर की समीक्षा करने और लिंक से महत्वपूर्ण जानकारी को उत्तर में एकीकृत करने के लायक हो सकता है। आप या तो महत्वपूर्ण बिट्स (ब्लॉकक्वाट स्वरूपण का उपयोग करके) और/या संक्षेप में (अपने शब्दों का उपयोग करके) को उद्धृत करके ऐसा कर सकते हैं। संदर्भ प्रदान करने के लिए लिंक छोड़ दें। मुझे लगता है कि यह इसके लायक होगा, क्योंकि इसने वर्षों में एक बहुत लोकप्रिय जवाब साबित कर दिया है। –

1

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

यदि यह एक सार्वजनिक एपीआई है (कोई भी उदाहरण के लिए एपीआई कुंजी प्राप्त कर सकता है) तो मैं उपरोक्त उत्तर से ब्लॉग पोस्ट में विधि का उपयोग करने का सुझाव दूंगा।

जावास्क्रिप्ट ग्राहक के लिए, https://github.com/jpillora/jquery.rest कोशिश करता है, तो कुछ भी याद आ रही है सुविधा अनुरोध सबमिट या यदि आप :)

8

तरह "मैं कहाँ उलझन में हो रही शुरू कैसे इन साइटों पर उपयोगकर्ताओं अपने आवेदन को प्रमाणित करने के लिए है योगदान ।ऐसा लगता है कि यह बाहरी साइट मेरे उपयोगकर्ता का खाता और पासवर्ड जानकारी संग्रहीत करने के लिए एक बुरा विचार है; " -

आरईएसटी एपीआई के साथ, इसे संभालने का सबसे अच्छा तरीका है अपने ग्राहकों (वेब ​​पेज, मोबाइल ऐप्स) का उपयोग करना चाहे उपयोगकर्ता द्वारा दर्ज किए गए उपयोगकर्ता क्रेडेंशियल्स के माध्यम से आपके डोमेन या बाहरी पास से (लॉग इन पेज में)। आपके पास एक लॉगिन/लॉगआउट एपीआई होगा जो प्रमाणीकरण की देखभाल करता है।

जब लॉगिन एपीआई प्रमाणीकृत करता है, तो यह टोकन देता है (एक तरह से हैश शायद किसी भी चीज की उपयोगकर्ता वरीयताओं के लिए), जिसे क्लाइंट साइड पर एन्क्रिप्टेड कुकी में संग्रहीत किया जा सकता है। इस तरह, आपके क्लाइंट सीधे उपयोगकर्ता क्रेडेंशियल को संभाल नहीं लेते हैं। जब भी आप चाहें तो टोकन समाप्त हो जाएगा।

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

यदि उपयोगकर्ता टोकन की समाप्ति से पहले लॉग आउट करता है, तो लॉगिन/लॉगआउट API स्थानीय कैश से इस टोकन को हटा देगा, और आपके क्लाइंट को सत्र/कुकी को हटाना होगा।

इस तरह आपके प्रमाण पत्र क्लाइंट पक्ष पर कभी भी पारित नहीं होते हैं।

और निश्चित रूप से डेटा-इन-गति सुरक्षा एसएसएल और HTTP डाइजेस्ट द्वारा भी हासिल की जानी चाहिए।

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

  • कोई संबंधित समस्या नहीं^_^