2013-02-09 56 views
57

मैं angularjs के साथ नया हूँ ...एक angularjs ऐप में एक सुरक्षित (!) प्रमाणीकरण प्रणाली कैसे प्राप्त करें?

मैंने दस्तावेज़ पढ़े, और ट्यूटोरियल पूरा किया; मैंने खुद से कुछ और करने की कोशिश की, और चीजें मुझे समझने लगती हैं।

अब मुझे आश्चर्य है कि सुरक्षित प्रमाणीकरण प्रणाली कैसे बनाएं।

आसान हिस्सा: कोई कोड, मैं संचालन मेरे कोड का वर्णन करेंगे निष्पादित करें: उपयोगकर्ता नाम और पासवर्ड पाठ इनपुट:

मैं एक क्लासिक रूप है।

उपयोगकर्ता फॉर्म भरता है, और ENTER दबाता है।

एक AJAX अनुरोध शुरू होता है, और प्रतिक्रिया एक JSON मुझे बताती है जैसे "ठीक है मैं आपको जानता हूं" या "मैं नहीं जानता कि आप कौन हैं"।

मुझे अब जो चाहिए वह मेरे आवेदन के विभिन्न विचारों के बीच आगंतुक (या लॉग नहीं) की लॉग स्थिति को मैप करना है।

मैंने इंटरनेट पर पढ़ा है कि, इस उद्देश्य को प्राप्त करने के लिए, कोई एक चर ($ scope.isLogged = true) सेट करता है, कोई और कुकीज़ का उपयोग करता है; लेकिन जावास्क्रिप्ट चर, और कुकीज़ आसानी से फायरबग, या समान विकास उपकरण का उपयोग कर संपादित किया जा सकता है।

... और अंत में सवाल:

तो, आप एक AngularJS अनुप्रयोग में एक सुरक्षित प्रमाणीकरण प्रणाली को प्राप्त करने के लिए कुछ सुझाव हैं?

उत्तर

54

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

आप सर्वर पर चीजों को अधिकृत कर सकते हैं, और सामान्य तरीके से आप इसे सामान्य तरीके से कर सकते हैं - सत्र का उपयोग करके; कोई विशेष कोड जरूरी नहीं है, AJAX कॉल सामान्य सत्र कुकीज़ का उपयोग करें। एप्लिकेशन को यह जानने की आवश्यकता नहीं है कि यह प्रमाणित है या नहीं। यह केवल जांचने की जरूरत है कि सर्वर क्या सोचता है।

आपके कोणीय अनुप्रयोग के परिप्रेक्ष्य से, "लॉग इन" या "लॉग आउट" होने के कारण उपयोगकर्ता के लिए केवल एक गुई संकेत है।

+15

+1, खासकर "आपके कोणीय अनुप्रयोग के परिप्रेक्ष्य से," लॉग इन "या" लॉग आउट "होने के कारण उपयोगकर्ता के लिए केवल एक गुई संकेत है।" यदि कोई उपयोगकर्ता अपने निष्पादन वातावरण से छेड़छाड़ करना चाहता है जैसे कि कोणीय सोचता है कि वे लॉग इन हैं, तो हो - जब तक सर्वर वास्तविक डेटा को बदलने वाले किसी भी क्रिया को प्रमाणित करता है, आदि –

+0

हाय, धन्यवाद। मुझे आपके जवाब में दिलचस्पी है। विशेष रूप से उस हिस्से में जहां आप सत्र का उल्लेख करते हैं, क्योंकि यह पारंपरिक तरीका है क्योंकि मैंने काम किया ... मैं PHP का उपयोग सर्वर साइड भाषा के रूप में करता हूं ... बस एक और सवाल (मेरे पास अब व्यक्तिगत रूप से प्रयास करने का समय नहीं है, लेकिन मैं Asap [अपने जवाब से अनिवार्य रूप से, मैं वादा करता हूँ :)]): अगर AJAX अनुरोध के दौरान एक सत्र सेट, तो यह सत्र अगले अनुरोधों में भी उपलब्ध है, है ना? – Bruno

+0

@ ब्रूनो: हाँ। "सत्र" "पहचानकर्ता के साथ कुकी" के लिए एक और शब्द है और चूंकि AJAX अनुरोध सामान्य अनुरोधों (और एक दूसरे) के साथ कुकीज़ साझा करते हैं, तो आपका सर्वर पक्ष बस काम करेगा। – fdreger

4

सबसे पहले: क्लाइंट-साइड डेटा हमेशा छेड़छाड़ या छेड़छाड़ की जा सकती है।

जब तक वैध सत्र आईडी आसानी से अनुमानित नहीं होते हैं और क्लाइंट के आईपी के साथ सत्र टोकन को जोड़ने जैसे उपायों के बारे में कोई बड़ा सौदा नहीं होता है।

सिद्धांत रूप में, आप कुकी को एन्क्रिप्ट भी कर सकते हैं, जब तक आप सर्वर की तरफ ऐसा करते हैं।

अपनी कुकी को एन्क्रिप्ट करने के लिए, अपने सर्वर साइड के दस्तावेज़ देख सकेंगे (Express.js के लिए जैसे http://expressjs.com/api.html#res.cookie)

+0

सबसे पहले, आपके उत्तर के लिए धन्यवाद! जैसा कि आप सुझाव देते हैं, आगे बढ़ने पर, प्रत्येक बार दृश्य में परिवर्तन होता है, मुझे यह जांचने के लिए एक AJAX अनुरोध निष्पादित करना होगा कि चर/कुकी में संग्रहीत सत्र कुंजी प्रमाणीकरण के पल में उत्पन्न होती है ... क्या मैं सही हूँ? या मुझे कुछ टुकड़ा याद आ रहा है? – Bruno

+7

असल में, प्रत्येक HTTP अनुरोध के लिए जिसे उपयोगकर्ता को प्रमाणित करने की आवश्यकता होती है, सर्वर अनुरोध के समय सत्र कुंजी की जांच करेगा। फिर यदि सत्र कुंजी सही नहीं है, तो सर्वर वापस '401 अधिकृत नहीं' भेज सकता है डेटा चाहता था ग्राहक। –

47

शायद आपको एक समाधान मिला, लेकिन वर्तमान में मैंने एक प्रामाणिकता योजना बनाई है जिसे मैं अपने कोणीय ऐप में कार्यान्वित कर रहा हूं।

चालू। ऐप एक सक्रिय सत्र सेट के साथ गलत पर पंजीकृत है। यह तब जांचता है कि ब्राउज़र में टोकन और उपयोगकर्ता आईडी के साथ कुकी है या नहीं।

यदि हां, सर्वर पर टोकन + userId की जाँच करें और दोनों सर्वर और स्थानीय रूप से टोकन अद्यतन करता

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

टोकन का उपयोग लगातार लॉगिन करने के लिए किया जाता है (मुझे 3 सप्ताह के लिए याद रखें) या जब उपयोगकर्ता ब्राउज़र पृष्ठ को रीफ्रेश करता है।

धन्यवाद

Authentication Scheme in Angular.js

+73

+1 से भी पेपर – Lee

+2

+1 का उपयोग करने के लिए +1, एक चित्र 1000 शब्द के लायक है :) – BetaCoder

+1

प्लस एक गंभीर प्रश्न लेने के लिए भी भले ही वह उस व्यक्ति से आ रहा है जिसे आप नहीं जानते – Adnan

18

3 महीने बीत चुके हैं मैं इस सवाल का ... पूछा और अब मैं जब मैं उपयोगकर्ता प्रमाणीकरण से निपटने के लिए है साझा करने के लिए क्या मेरी पसंदीदा दृष्टिकोण बन गया है चाहते हैं angularjs पर बनाया गया एक वेब ऐप में।

बेशक fdreger का जवाब अभी भी एक महान जवाब है

...

आप, AngularJS में कुछ भी अधिकृत नहीं कर सकते हैं क्योंकि उपयोगकर्ता निष्पादन वातावरण (यानी, ब्राउज़र) का पूरा नियंत्रण है।

आपके कोणीय अनुप्रयोग के परिप्रेक्ष्य से, या "लॉग आउट" होने पर उपयोगकर्ता के लिए केवल एक गुई संकेत है। मार्ग स्वयं के बारे में प्रत्येक मार्ग में अतिरिक्त जानकारी के लिए

1) बाँध:

तो, संक्षेप में मेरी दृष्टिकोण में होते हैं।

$routeProvider.when('/login', { 
    templateUrl: 'partials/login.html', controller: 'loginCtrl', isFree: true 
}); 

2) उपयोगकर्ता के बारे में डेटा mantain के लिए एक सेवा का उपयोग करें, और उसके प्रमाणीकरण स्थिति।

services.factory('User', [function() { 
    return { 
     isLogged: false, 
     username: '' 
    }; 
}]); 

3) हर उपयोगकर्ता की जाँच करता है, तो वह उपयोग करने के लिए अनुदान है एक नया मार्ग तक पहुँचने का प्रयास,।

$root.$on('$routeChangeStart', function(event, currRoute, prevRoute){ 
    // prevRoute.isFree tell me if this route is available for all the users, or only for registered user. 
    // User.isLogged tell me if the user is logged 
}) 

मैं भी इस दृष्टिकोण (विस्तार से अधिक) अपने ब्लॉग, users authentication with angularjs पर के बारे में लिखा था।

0

आपको इसके सर्वर सर्वर/डेटाबेस के अंत के बारे में जानने की आवश्यकता है।

उपयोगकर्ता लॉगिन को कहीं भी संग्रहीत करने की आवश्यकता है - यह 99.9% सर्वर सर्वर डेटाबेस में है।

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

एक स्क्रिप्ट जिसे मैंने सफलतापूर्वक उपयोग किया है वह एम्बर https://www.amember.com/ रहा है। यह जाने का एक बहुत ही प्रभावी तरीका है हालांकि वहां कई अन्य स्क्रिप्ट हैं, मुझे इसके साथ बहुत सफलता मिली है .. यह भी PHP है ताकि आप अपने कोणीय http कॉल के लिए एक एपीआई बना सकें आसानी से।

इन सभी जावास्क्रिप्ट ढांचे बहुत अच्छे हैं लेकिन प्रभाव यह है कि अब बहुत से चीजों के सामने के अंत में बहुत अधिक ध्यान केंद्रित कर रहे हैं - डेटाबेस/बैकएंड सीखें! :-)