angularjs - एंगुलरजेएस, सत्र प्रबंधन और आरईएसटी एपी डब्ल्यूएस के साथ सुरक्षा मुद्दों के साथ प्रमाणीकरण




rest authentication (2)

यदि आप https से https से बात करते हैं, तो आपको रीप्ले हमलों के साथ कोई समस्या नहीं है।

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

यदि आप अपने एपीआई को व्यापक दर्शकों के लिए बेनकाब करने की योजना बना रहे हैं (विशेष रूप से ब्राउज़र-आधारित यूआई जो आप सेवा करते हैं) या अन्य प्रकार के क्लाइंट (जैसे मोबाइल ऐप) पर, ओएथ को अपनाने पर विचार करें।

मेरे सिर के ऊपर से, एंगुलर में निम्नलिखित सुरक्षा विशेषताएं हैं (वे पॉप-आउट के रूप में और अधिक जोड़ देंगे):

सीएसआरएफ / एक्सएसआरएफ हमलों

कोणीय CSRF संरक्षण के लिए बॉक्स तंत्र से बाहर का समर्थन करता है। $http docs । सर्वर-साइड समर्थन की आवश्यकता है।

सामग्री सुरक्षा नीति

कोणीय में अभिव्यक्ति मूल्यांकन का एक तरीका है जो अधिक सख्त जावास्क्रिप्ट रनटाइम के साथ संगत है जो CSP सक्षम होने पर लागू होते हैं। ng-csp docs

सख्त प्रासंगिक भागने

XSS हमलों आदि के खिलाफ यूआई को कड़ी मेहनत करने के लिए कोणीय की नई $sce सुविधा (1.2+) का उपयोग करें। यह थोड़ा कम सुविधाजनक लेकिन अधिक सुरक्षित है। here दस्तावेज़ देखें।

मैंने angularJS के साथ एक वेब-ऐप विकसित करना शुरू किया और मुझे यकीन नहीं है कि सबकुछ सही है (क्लाइंट और सर्वर पक्ष)। सुरक्षा एक लॉगिन पृष्ठ पर आधारित है, यदि प्रमाण-पत्र ठीक से चेक किए गए हैं, तो मेरा सर्वर कस्टम समय-वैधता के साथ एक अद्वितीय टोकन भेजता है। अन्य सभी आरईएसटी एपीआई इस टोकन के माध्यम से सुलभ हैं। एप्लिकेशन (क्लाइंट) मेरे एंट्री पॉइंट एक्स पर ब्राउज़ करें: https://www.example.com/home.html उपयोगकर्ता क्रेडेंशियल्स डालें और एक अद्वितीय टोकन वापस प्राप्त करें। यह अद्वितीय टोकन सर्वर डेटाबेस में एईएस या अन्य सुरक्षित तकनीकों के साथ संग्रहीत है, यह स्पष्ट प्रारूप में संग्रहीत नहीं है।

अब से, मेरा AngluarJS ऐप इस टोकन का उपयोग सभी आरईएसटी एपीआई को प्रमाणित करने के लिए करेगा।

मैं एक कस्टम http कुकी में टोकन अस्थायी स्टोर पर सोच रहा हूँ; मूल रूप से, जब सर्वर प्रमाण-पत्र सत्यापित करता है, तो यह एक नई कुकी एक्स भेजता है।

app-token : AIXOLQRYIlWTXOLQRYI3XOLQXOLQRYIRYIFD0T

कुकी में secure और HTTP केवल ध्वज सेट हैं। एचटीपी प्रोटोकॉल सीधे नई कुकी का प्रबंधन और इसे स्टोर करें। लगातार अनुरोध कुकी को नए पैरामीटर के साथ प्रस्तुत करेंगे, इसे प्रबंधित करने की आवश्यकता के बिना और जावास्क्रिप्ट के साथ स्टोर करें; प्रत्येक अनुरोध पर, सर्वर टोकन को अमान्य करता है और एक नया उत्पन्न करता है और उसे क्लाइंट को वापस भेजता है -> एक टोकन के साथ रीप्ले-हमलों को रोकें।

जब ग्राहक किसी भी आरईएसटी एपीआई से HTTP स्थिति 401 अनधिकृत प्रतिक्रिया प्राप्त करता है, तो कोणीय नियंत्रक सभी कुकीज़ को साफ़ करता है और उपयोगकर्ता को लॉगिन पृष्ठ पर रीडायरेक्ट करता है।

क्या मुझे अन्य पहलुओं पर विचार करना चाहिए? क्या टोकरी को एक नई कुकी या स्थानीय स्टोरेज में स्टोर करना बेहतर है? एक अद्वितीय मजबूत टोकन उत्पन्न करने के तरीके पर कोई सुझाव?

संपादित करें (सुधार):

  • मैंने 20 मिनट की वैधता के साथ सत्र टोकन जेनरेटर के रूप में एचएमएसी-एसएचए 256 का उपयोग करने का निर्णय लिया। मैं एक यादृच्छिक 32byte GUID उत्पन्न करता हूं, एक टाइमस्टैम्प संलग्न करता हूं और 40 बाइट कुंजी प्रदान करके HASH-SHA256 की गणना करता हूं। टक्कर प्राप्त करना काफी असंभव है क्योंकि टोकन वैधता काफी कम है।
  • कुकी में सुरक्षा बढ़ाने के लिए डोमेन और पथ विशेषताओं होंगे।
  • कोई बहु-लॉग इन की अनुमति नहीं है।

यह क्लाइंट साइड सुरक्षा है जिसे आप नियमित कोणीय संस्करणों में कार्यान्वित कर सकते हैं। मैंने कोशिश की और इसका परीक्षण किया है। (कृपया मेरा आलेख यहां खोजें: - http://www.codeproject.com/Tips/811782/AngularJS-Routing-Security रूटिंग- सुरक्षा) क्लाइंट साइड रूट सुरक्षा के अतिरिक्त, आपको सर्वर पक्ष पर भी पहुंच सुरक्षित करने की आवश्यकता है। क्लाइंट साइड सुरक्षा सर्वर के लिए अतिरिक्त राउंड ट्रिप से बचने में मदद करती है। हालांकि, अगर कोई ब्राउज़र को चालित करता है, तो सर्वर सर्वर साइड सुरक्षा अनधिकृत पहुंच को अस्वीकार करने में सक्षम होना चाहिए।

उम्मीद है की यह मदद करेगा!

चरण 1: ऐप-मॉड्यूल में वैश्विक चर परिभाषित करें

आवेदन के लिए भूमिका निभाएं

  var roles = {
        superUser: 0,
        admin: 1,
        user: 2
    };

आवेदन के लिए अनधिकृत पहुंच के लिए परिभाषित मार्ग

 var routeForUnauthorizedAccess = '/SomeAngularRouteForUnauthorizedAccess';

चरण 2: प्राधिकरण के लिए सेवा को परिभाषित करें

appModule.factory('authorizationService', function ($resource, $q, $rootScope, $location) {
    return {
    // We would cache the permission for the session, to avoid roundtrip to server for subsequent requests
    permissionModel: { permission: {}, isPermissionLoaded: false  },

    permissionCheck: function (roleCollection) {
    // we will return a promise .
            var deferred = $q.defer();

    //this is just to keep a pointer to parent scope from within promise scope.
            var parentPointer = this;

    //Checking if permisison object(list of roles for logged in user) is already filled from service
            if (this.permissionModel.isPermissionLoaded) {

    //Check if the current user has required role to access the route
                    this.getPermission(this.permissionModel, roleCollection, deferred);
} else {
    //if permission is not obtained yet, we will get it from  server.
    // 'api/permissionService' is the path of server web service , used for this example.

                    $resource('/api/permissionService').get().$promise.then(function (response) {
    //when server service responds then we will fill the permission object
                    parentPointer.permissionModel.permission = response;

    //Indicator is set to true that permission object is filled and can be re-used for subsequent route request for the session of the user
                    parentPointer.permissionModel.isPermissionLoaded = true;

    //Check if the current user has required role to access the route
                    parentPointer.getPermission(parentPointer.permissionModel, roleCollection, deferred);
}
                );
}
            return deferred.promise;
},

        //Method to check if the current user has required role to access the route
        //'permissionModel' has permission information obtained from server for current user
        //'roleCollection' is the list of roles which are authorized to access route
        //'deferred' is the object through which we shall resolve promise
    getPermission: function (permissionModel, roleCollection, deferred) {
        var ifPermissionPassed = false;

        angular.forEach(roleCollection, function (role) {
            switch (role) {
                case roles.superUser:
                    if (permissionModel.permission.isSuperUser) {
                        ifPermissionPassed = true;
                    }
                    break;
                case roles.admin:
                    if (permissionModel.permission.isAdministrator) {
                        ifPermissionPassed = true;
                    }
                    break;
                case roles.user:
                    if (permissionModel.permission.isUser) {
                        ifPermissionPassed = true;
                    }
                    break;
                default:
                    ifPermissionPassed = false;
            }
        });
        if (!ifPermissionPassed) {
            //If user does not have required access, we will route the user to unauthorized access page
            $location.path(routeForUnauthorizedAccess);
            //As there could be some delay when location change event happens, we will keep a watch on $locationChangeSuccess event
            // and would resolve promise when this event occurs.
            $rootScope.$on('$locationChangeSuccess', function (next, current) {
                deferred.resolve();
            });
        } else {
            deferred.resolve();
        }
    }

};
});

चरण 3: रूटिंग में सुरक्षा का उपयोग करें: मार्गों को सुरक्षित करने के लिए अब तक किए गए हमारे सभी हार्डवर्ड का उपयोग करने दें

var appModule = angular.module("appModule", ['ngRoute', 'ngResource'])
    .config(function ($routeProvider, $locationProvider) {
        $routeProvider
            .when('/superUserSpecificRoute', {
                templateUrl: '/templates/superUser.html',//path of the view/template of route
                caseInsensitiveMatch: true,
                controller: 'superUserController',//angular controller which would be used for the route
                resolve: {//Here we would use all the hardwork we have done above and make call to the authorization Service 
                    //resolve is a great feature in angular, which ensures that a route controller(in this case superUserController ) is invoked for a route only after the promises mentioned under it are resolved.
                    permission: function(authorizationService, $route) {
                        return authorizationService.permissionCheck([roles.superUser]);
                    },
                }
            })
        .when('/userSpecificRoute', {
            templateUrl: '/templates/user.html',
            caseInsensitiveMatch: true,
            controller: 'userController',
            resolve: {
                permission: function (authorizationService, $route) {
                    return authorizationService.permissionCheck([roles.user]);
                },
            }
           })
             .when('/adminSpecificRoute', {
                 templateUrl: '/templates/admin.html',
                 caseInsensitiveMatch: true,
                 controller: 'adminController',
                 resolve: {
                     permission: function(authorizationService, $route) {
                         return authorizationService.permissionCheck([roles.admin]);
                     },
                 }
             })
             .when('/adminSuperUserSpecificRoute', {
                 templateUrl: '/templates/adminSuperUser.html',
                 caseInsensitiveMatch: true,
                 controller: 'adminSuperUserController',
                 resolve: {
                     permission: function(authorizationService, $route) {
                         return authorizationService.permissionCheck([roles.admin,roles.superUser]);
                     },
                 }
             })
    });




angularjs-authentication