rest - विश्वसनीय प्रमाणीकरण




authentication restful-authentication (9)

रीस्टफुल प्रमाणीकरण का क्या अर्थ है और यह कैसे काम करता है? मुझे Google पर एक अच्छा अवलोकन नहीं मिल रहा है। मेरी एकमात्र समझ यह है कि आप यूआरएल में सत्र कुंजी (रीमेबरल) पास करते हैं, लेकिन यह बहुत गलत हो सकता है।


@skrebel ( here ) द्वारा उल्लिखित 'बहुत अंतर्दृष्टि' आलेख प्रमाणीकरण की एक जटिल लेकिन वास्तव में टूटी हुई विधि पर चर्चा करता है।

आप किसी भी लॉगिन प्रमाण-पत्र के बिना पृष्ठ पर जाने का प्रयास कर सकते हैं (जिसे केवल प्रमाणीकृत उपयोगकर्ता के लिए देखा जा सकता है) http://www.berenddeboer.net/rest/site/authenticated.html

(क्षमा करें मैं जवाब पर टिप्पणी नहीं कर सकता।)

मैं कहूंगा कि आरईएसटी और प्रमाणीकरण बस मिश्रण नहीं करते हैं। आरईएसटी का मतलब स्टेटलेस है लेकिन 'प्रमाणित' एक राज्य है। आप दोनों एक ही परत पर नहीं हो सकते हैं। यदि आप एक प्रतिष्ठित वकील हैं और राज्यों पर फंसे हैं, तो आपको HTTPS के साथ जाना होगा (यानी सुरक्षा समस्या को किसी अन्य परत पर छोड़ दें)।


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

यथार्थवादी दृष्टिकोण आपके जीवन को आसान बनाने और सत्रों की लागत को कम करने और सत्रों की लागत को कम करने के लिए माना जाता है, इसे करने का प्रयास करें क्योंकि यह एक बुद्धिमान बात है, लेकिन जिस क्षण आप अनुशासन (किसी अनुशासन / दिशानिर्देश) का पालन करते हैं, अब वह लाभ प्रदान नहीं करता है जिसका उद्देश्य था, फिर आप इसे गलत कर रहे हैं। आज की कुछ बेहतरीन भाषाओं में कार्यात्मक प्रोग्रामिंग और ऑब्जेक्ट ओरिएंटेशन दोनों हैं।

यदि आपकी समस्या का समाधान करने का सबसे आसान तरीका कुकी में प्रमाणीकरण कुंजी को संग्रहीत करना है और इसे HTTP शीर्षलेख पर भेजना है, तो इसे करें, बस इसका दुरुपयोग न करें। याद रखें कि जब वे भारी और बड़े होते हैं तो सत्र खराब होते हैं, यदि आपके सभी सत्र में एक कुंजी युक्त एक छोटी स्ट्रिंग होती है, तो बड़ा सौदा क्या होता है?

मैं टिप्पणियों में सुधार स्वीकार करने के लिए खुला हूं लेकिन मुझे अपने सर्वर में हैश का एक बड़ा शब्दकोश रखने से बचने के लिए बस हमारे जीवन को दुखी करने में बिंदु (अब तक) नहीं दिख रहा है।


मुझे संदेह है कि क्या लोगों ने उत्साहपूर्वक "HTTP प्रमाणीकरण" चिल्लाते हुए आरईएसटी के साथ ब्राउज़र-आधारित एप्लिकेशन (मशीन-टू-मशीन वेब सेवा की बजाय) बनाने की कोशिश की है (कोई अपराध नहीं है - मुझे नहीं लगता कि उन्हें कभी भी जटिलताओं का सामना करना पड़ता है) ।

रीस्टफुल सेवाओं पर HTTP प्रमाणीकरण का उपयोग करने में मिली समस्याएं जो ब्राउज़र में HTML पृष्ठों को देखने के लिए उत्पन्न करती हैं:

  • उपयोगकर्ता को आम तौर पर एक बदसूरत ब्राउज़र से बना लॉगिन बॉक्स मिलता है, जो बहुत उपयोगकर्ता-असभ्य है। आप पासवर्ड पुनर्प्राप्ति, सहायता बॉक्स, आदि नहीं जोड़ सकते हैं।
  • एक अलग नाम के तहत लॉग इन या लॉग इन करना एक समस्या है - ब्राउज़र विंडो तक प्रमाणीकरण जानकारी भेजते रहेंगे जब तक आप विंडो बंद नहीं करते
  • टाइमआउट मुश्किल हैं

एक बिंदु पर इन बिंदुओं को हल करने वाला एक बहुत ही अंतर्दृष्टि लेख here , लेकिन इसके परिणामस्वरूप ब्राउज़र-विशिष्ट जावास्क्रिप्ट हैकरी, वर्कअराउंड के लिए कामकाज, et cetera। इस प्रकार, यह आगे-संगत नहीं है, इसलिए निरंतर रखरखाव की आवश्यकता होगी क्योंकि नए ब्राउज़र जारी किए जाते हैं। मैं उस साफ और स्पष्ट डिजाइन पर विचार नहीं करता हूं, साथ ही मुझे लगता है कि यह बहुत अधिक काम और सिरदर्द है ताकि मैं उत्साही रूप से अपने दोस्तों को अपना आरईएसटी-बैज दिखा सकूं।

मेरा मानना ​​है कि कुकीज़ समाधान हैं। लेकिन रुको, कुकीज़ बुराई है, है ना? नहीं, वे नहीं हैं, जिस तरह से कुकीज़ का अक्सर उपयोग किया जाता है वह बुरा होता है। एक कुकी स्वयं क्लाइंट-साइड जानकारी का एक टुकड़ा है, बस HTTP प्रमाणीकरण जानकारी की तरह ही ब्राउज़र ब्राउज़ करते समय ट्रैक रखेगा। और क्लाइंट-साइड जानकारी का यह टुकड़ा सर्वर पर प्रत्येक अनुरोध पर भेजा जाता है, फिर से जैसे ही HTTP प्रमाणीकरण जानकारी होगी। संकल्पनात्मक रूप से, केवल अंतर यह है कि क्लाइंट-साइड स्टेट के इस टुकड़े की सामग्री सर्वर द्वारा इसकी प्रतिक्रिया के हिस्से के रूप में निर्धारित की जा सकती है।

सत्रों को केवल निम्नलिखित नियमों के साथ एक विश्वसनीय संसाधन बनाकर:

  • एक सत्र उपयोगकर्ता आईडी (और संभवतः टाइमआउट के लिए अंतिम-क्रिया-टाइमस्टैम्प) की कुंजी को मानचित्र करता है
  • यदि कोई सत्र मौजूद है, तो इसका मतलब है कि कुंजी मान्य है।
  • लॉगिन का अर्थ है / सत्र में पोस्ट करना, कुकी के रूप में एक नई कुंजी सेट की जाती है
  • लॉगआउट का अर्थ है DELETEING / सत्र / {कुंजी} (ओवरलोडेड पोस्ट के साथ, याद रखें, हम एक ब्राउज़र हैं, और HTML 5 अभी तक जाने का लंबा सफर है)
  • प्रमाणन प्रत्येक अनुरोध पर एक कुकी के रूप में कुंजी भेजकर और यह जांच रहा है कि सत्र मौजूद है या मान्य है

HTTP प्रमाणीकरण में एकमात्र अंतर, अब, यह है कि प्रमाणीकरण कुंजी सर्वर द्वारा जेनरेट की जाती है और क्लाइंट को भेजती है जो क्लाइंट को दर्ज किए गए क्रेडेंशियल से कंप्यूटिंग करने के बजाय इसे वापस भेजती है।

कनवर्टर 42 में कहा गया है कि https (जिसे हमें करना चाहिए) का उपयोग करते समय, यह महत्वपूर्ण है कि कुकी के पास इसका सुरक्षित ध्वज सेट होगा ताकि प्रमाणीकरण जानकारी किसी गैर-सुरक्षित कनेक्शन पर कभी नहीं भेजी जा सके। महान बिंदु, इसे खुद नहीं देखा था।

मुझे लगता है कि यह एक पर्याप्त समाधान है जो ठीक काम करता है, लेकिन मुझे यह स्वीकार करना होगा कि इस योजना में संभावित छेद की पहचान करने के लिए मैं पर्याप्त सुरक्षा विशेषज्ञ नहीं हूं - मुझे पता है कि सैकड़ों गैर-भरोसेमंद वेब अनुप्रयोग अनिवार्य रूप से समान हैं लॉगिन प्रोटोकॉल ($ _SESSION inphp, जावा ईई में एचटीपीशन, आदि)। कुकी हेडर सामग्री का उपयोग सर्वर-साइड संसाधन को संबोधित करने के लिए किया जाता है, जैसे अनुवाद संसाधनों, इत्यादि तक पहुंचने के लिए स्वीकार्य भाषा का उपयोग किया जा सकता है। मुझे लगता है कि यह वही है, लेकिन शायद दूसरों को नहीं? तुम लोग क्या सोचते हो?


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

इसका उपयोग करने का सबसे आसान तरीका आरएफसी 2617 में HTTP के अंतर्निहित प्रमाणीकरण तंत्र से शुरू करना है।


यहां एक सचमुच और पूरी तरह से विश्वसनीय प्रमाणीकरण समाधान है:

  1. प्रमाणीकरण सर्वर पर एक सार्वजनिक / निजी कुंजी जोड़ी बनाएँ।
  2. सभी सर्वरों के लिए सार्वजनिक कुंजी वितरित करें।
  3. जब कोई ग्राहक प्रमाणित करता है:

    3.1। एक टोकन जारी करें जिसमें निम्नलिखित शामिल हैं:

    • समय सीमा समाप्ति समय
    • उपयोगकर्ता का नाम (वैकल्पिक)
    • उपयोगकर्ता आईपी (वैकल्पिक)
    • पासवर्ड का हैश (वैकल्पिक)

    3.2। निजी कुंजी के साथ टोकन एन्क्रिप्ट करें।

    3.3। एन्क्रिप्टेड टोकन को उपयोगकर्ता को वापस भेजें।

  4. जब उपयोगकर्ता किसी भी एपीआई तक पहुंचता है तो उन्हें अपने ऑथ टोकन में भी पास होना चाहिए।

  5. सर्वर सत्यापित कर सकते हैं कि टोकन को लेखक सर्वर की सार्वजनिक कुंजी का उपयोग करके इसे डिक्रिप्ट करके मान्य किया गया है।

यह स्टेटलेस / रीस्टफुल प्रमाणीकरण है।

ध्यान दें, कि अगर एक पासवर्ड हैश शामिल किया गया था तो उपयोगकर्ता प्रमाणीकरण टोकन के साथ अनएन्क्रिप्टेड पासवर्ड भी भेज देगा। सर्वर यह सत्यापित कर सकता है कि पासवर्ड पासवर्ड से मेल खाता है जिसका उपयोग हैश की तुलना करके प्रमाणीकरण टोकन बनाने के लिए किया गया था। एचटीटीपीएस जैसे कुछ का उपयोग कर एक सुरक्षित कनेक्शन आवश्यक होगा। क्लाइंट साइड पर जावास्क्रिप्ट उपयोगकर्ता के पासवर्ड को प्राप्त करने और इसे क्लाइंट पक्ष को संग्रहीत करने में संभाल सकता है, या तो मेमोरी या कुकी में, संभवतः सर्वर की सार्वजनिक कुंजी से एन्क्रिप्ट किया जा सकता है।


सबसे पहले और सबसे महत्वपूर्ण, एक विश्वसनीय वेब सेवा STATELESS है (या दूसरे शब्दों में, SESSIONLESS )। इसलिए, एक विश्वसनीय सेवा में सत्र या कुकीज़ शामिल नहीं है और इसमें अवधारणा नहीं होनी चाहिए। रीस्टफुल सेवा में प्रमाणीकरण या प्रमाणीकरण करने का तरीका आरएफसी 2616 HTTP विनिर्देशों में परिभाषित HTTP प्राधिकरण शीर्षलेख का उपयोग करना है। प्रत्येक एकल अनुरोध में HTTP प्राधिकरण शीर्षलेख होना चाहिए, और अनुरोध HTTP (SSL) कनेक्शन पर भेजा जाना चाहिए। प्रमाणीकरण करने और HTTP रीस्टफुल वेब सेवाओं में अनुरोधों के प्रमाणीकरण को सत्यापित करने का यह सही तरीका है। मैंने सिस्को सिस्टम्स में सिस्को प्राइम परफॉर्मेंस मैनेजर एप्लिकेशन के लिए एक शानदार वेब सेवा लागू की है। और उस वेब सेवा के हिस्से के रूप में, मैंने प्रमाणीकरण / प्रमाणीकरण भी लागू किया है।

रूबेन्स गोम्स।


I think the following approach can be used for REST service authentication:

  1. Create a login RESTful API to accept username and password for authentication. Use HTTP POST method to prevent caching and SSL for security during transit On successful authentication, the API returns two JWTs - one access token (shorter validity, say 30 minutes) and one refresh token (longer validity, say 24 hours)
  2. The client (a web based UI) stores the JWTs in local storage and in every subsequent API call passes the access token in "Authorization: Bearer #access token" header
  3. The API checks the validity of the token by verifying the signature and expiry date. If the token is valid, check if the user (It interprets the "sub" claim in JWT as username) has access to the API with a cache lookup. If the user is authorized to access the API, execute the business logic
  4. If the token is expired, the API returns HTTP response code 400
  5. The client, on receiving 400/401, invokes another REST API with the refresh token in "Authorization: Bearer #refresh token" header to get a new access token.
  6. On receiving the call with refresh token, check if the refresh token is valid by checking the signature and the expiry date. If the refresh token is valid, refresh the access right cache of the user from DB and return new access token and refresh token. If the refresh token is invalid, return HTTP response code 400
  7. If a new access token and refresh token are returned, go to step 2. If HTTP response code 400 is returned, the client assumes that the refresh token has expired and asks for username and password from the user
  8. For logout, purge the local storage

With this approach we are doing the expensive operation of loading the cache with user specific access right details every 30 minutes. So if an access is revoked or new access is granted, it takes 30 minutes to reflect or a logout followed by a login.


That's the way to do that: Using OAuth 2.0 for Login .

You may use other authentication methods other then Google's as long as it supports OAuth.


Using a Public key infrastruction in which the registration of a key involves proper binding ensures that the public key is bound to the individual to which it is assigned in a way that ensures non-repudiation

See http://en.wikipedia.org/wiki/Public_key_infrastructure . If you follow the proper PKI standards, the person or agent who improperly uses the stolen key can be identified and locked out. If the agent is required to use a certificate, the binding gets pretty tight. A clever and quick-moving thief can escape, but they leave more crumbs.





rest-security