2013-11-15 3 views
7

मेरा ऐप एक्सप्रेस और एंगुलरजेएस का उपयोग करता है। मैं स्थिर के माध्यम से कोणीय कोड के मूल वेब सीवन को संभालने के लिए एक्सप्रेस का उपयोग कर रहा हूं। कोणीय कोड उन सेवाओं का उपयोग करता है जो एक्सप्रेस द्वारा होस्ट किए गए एपीआई एंडपॉइंट्स को हिट करते हैं। मैं केवल यूजर एंडपॉइंट्स को उपयोगकर्ता द्वारा प्रमाणीकृत होने के बाद सुलभ होना चाहता हूं। मैं पासपोर्टजेएस के माध्यम से इसे कैसे पूरा कर सकता हूं?मैं पासपोर्टजेएस के साथ एक एपीआई एंडपॉइंट की रक्षा कैसे कर सकता हूं?

उत्तर

17

मैंने जिथब पर एक कोणीय-एक्सप्रेस project अपलोड किया है जिस पर मैं काम कर रहा हूं।

यह अभी भी प्रगति पर काम कर रहा है। मुझे उम्मीद है यह मदद करेगा।

यह उपयोगकर्ता प्रमाणीकरण के लिए पासपोर्टजे का उपयोग करता है और सर्वर साइड प्रमाणीकरण का एक मूल उदाहरण है। यह दर्शाता है कि एपीआई कॉल केवल प्रमाणीकृत उपयोगकर्ताओं के लिए सुलभ कैसे करें, या केवल व्यवस्थापक भूमिका वाले उपयोगकर्ताओं के लिए। यह server/routes.js में हासिल की है मिडलवेयर कार्यों ensureAuthenticated आह्वान करने और ensureAdmin जो

// anybody can access this 
app.get('/api/test/users', 
     api.testUsers); 


// only logged-in users with ADMIN role can access this 
app.get('/api/users',   
     authentication.ensureAdmin, 
     api.testUsers); 

// only logged-in users can access this 
app.get('/api/books', 
     authentication.ensureAuthenticated, 
     api.books); 

authentication.js

ensureAuthenticated: function(req, res, next) { 
    if (req.isAuthenticated()) { 
     return next(); 
    } else { 
     return res.send(401); 
    } 
}, 

ensureAdmin: function(req, res, next) { 
    // ensure authenticated user exists with admin role, 
    // otherwise send 401 response status 
    if (req.user && req.user.role == 'ADMIN') { 
     return next(); 
    } else { 
     return res.send(401); 
    } 
}, 
+0

परियोजना अभी तारांकित है।धन्यवाद! – nkint

0

मैं दो समाधान

angular-client-side-auth और angular-http-auth

आप इसे GitHub

+0

सुनिश्चित नहीं हैं कि मैं इन कैसे एकीकृत होगा routes.js में server/authentication.js

में परिभाषित कर रहे हैं ... – Shamoon

2

पर पा सकते हैं मैं अभी तक passportjs का उपयोग नहीं करते, लेकिन मैं सिर्फ एक ही बात आप के लिए देख रहे हैं किया है में जाना जाता है कर। यहाँ मेरी उदाहरण विन्यास है:

// Example configuration 
var express = require('express'); 
var routes = require('./routes'); 
var app = express(); 

app.configure(function(){ 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser('shhhh, very secret')); 
    app.use(express.session()); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(express.compress()); 
    app.use('/', express.static(expressAppdir)); // look for overrides on express server 1st 
    app.use('/', express.static(appDir)); 
    // app.use(express.methodOverride()); 
    app.use(app.router); 

    app.use(function(req, res, next){ 
     var err = req.session.error 
     , msg = req.session.success; 
     delete req.session.error; 
     delete req.session.success; 
     res.locals.message = ''; 
     if (err) res.locals.message = '<p class="msg error">' + err + '</p>'; 
     if (msg) res.locals.message = '<p class="msg success">' + msg + '</p>'; 
     next(); 
    }); 

}); 

app.configure(function() { 
    // gets 
    app.get('/', routes.root); 
    app.get('/login', routes.login); 
    app.get('/logout', routes.logout);  

    app.get('/restricted/test/:slug', restrict, routes.restrictedGet); // must be last API route, slug is any request on the end of the routes that is requested. 

    app.post('/login', routes.loginPost); 
}); 

function restrict(req, res, next) { 
    console.dir('restrict called'); 
    if (req.session.user) { 
    next(); 
    } else { 
    req.session.error = 'Access denied!'; 
    res.redirect('/login'); 
    } 
} 

//Routes.js file 

// my dummy login (in a separate file) 

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 

    passport.use(new LocalStrategy(
    function(username, password, done) { 
    User.findOne({ username: username }, function (err, user) { 
     if (err) { return done(err); } 
     if (!user) { 
     return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
     return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
    } 
)); 

exports.restrictedGet = function (req, res, next) { 
    console.dir('reached restricted get'); 

    var slug = req.params.slug; 
    console.dir(req.route); 

    if(req.route.path.indexOf('test')!=-1) 
    { 
    namedQuery['testFunction'](req,res,next); 
    } 
    else 
    { 
    res.status(404).send('no route found. Route requested: ' + req.route.path); 
    } 

    // do something with your route here, check what's being appended to the slug and fire off the appropriate function. 
}; 

exports.login = function(req, res, next) { 
    res.sendfile(serverBase + "/static/public/login.html"); 
}; 

exports.logout = function(req, res, next) { 
    req.session.destroy(function(){ 
     res.redirect('/'); 
    }); 
}; 

// this is where you would hook in your passportjs stuff to do hashing of inputted text and compare it to the hash stored in your db etc. 
// I use my own simple authentication funciton right now as i'm just testing. 

exports.loginPost = function(req, res, next) { 
    authenticate(req.body.username, req.body.password, function(err, user){ 
    console.log('Reached login user: ', user); 
    if (user) { 
      // Regenerate session when signing in 
      // to prevent fixation 
      req.session.regenerate(function(){ 

      req.session.user = user; 
      req.session.success = 'Authenticated as ' + user.name 
      + ' click to <a href="/logout">logout</a>. ' 
      + ' You may now access <a href="/restricted">/restricted</a>.'; 
       res.redirect('/'); 
      }); 
     } else { 
      req.session.error = 'Authentication failed, please check your ' 
      + ' username and password.' 
      + ' (use "tj" and "foobar")'; 
      res.json({success: false}); 
      res.redirect('/login'); 
     } 
     }); 
}; 

// You could now do this with passport instead: 
exports.loginPost = function(req, res, next) { 
    passport.authenticate('local'), function(err, user){ 
    console.log('Reached login user: ', user); 
    if (user) { 
      // Regenerate session when signing in 
      // to prevent fixation 
      req.session.regenerate(function(){ 

      req.session.user = user; 
      req.session.success = 'Authenticated as ' + user.name 
      + ' click to <a href="/logout">logout</a>. ' 
      + ' You may now access <a href="/restricted">/restricted</a>.'; 
       res.redirect('/'); 
      }); 
     } else { 
      req.session.error = 'Authentication failed, please check your ' 
      + ' username and password.' 
      + ' (use "tj" and "foobar")'; 
      res.json({success: false}); 
      res.redirect('/login'); 
     } 
     }; 
}; 

function authenticate(name, pass, fn) { 

    var user = { name:name, password: pass } 
    return fn(null,user); 

}; 

यह वह जगह है जहां मैंने अपने कोड की बहुत मिल गया: http://www.breezejs.com/samples/zza, http://passportjs.org/guide/authenticate/

आशा इस मदद करता है!

#

संपादित

#

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

1

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

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

लिंक: NODE.JS AND EXPRESS - BASIC AUTHENTICATION

आप इस PassportJS में पता लगा मिलता है, अपने परिणामों को वापस पोस्ट करें; मुझे यह देखना अच्छा लगेगा। (यही कारण है कि मैंने आपके प्रश्न को अप-वोट किया)

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

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