2012-03-27 18 views
17

मैं एक्सप्रेस और पासपोर्ट ओपनआईडी Google रणनीति का उपयोग कर रहा हूं और मैं प्रत्येक लेख अनुरोध पर वापसी URL सेट करना चाहता हूं ताकि वह उस पृष्ठ पर वापस लौटने में सक्षम हो सके।Node.js पर कस्टम रिटर्न यूआरएल पासपोर्ट की Google रणनीति

स्थिति यह है कि मेरे पास Node.js बैकएंड (और सामाजिक सामग्री और संपादक और पोर्टल और एक्सटेंशन ... https://github.com/bubersson/humla) के साथ HTML5 स्लाइड एप्लिकेशन है और मैं कुछ स्लाइड पर उपयोगकर्ता में लॉग इन करने में सक्षम होना चाहता हूं (स्लाइड मेनू के माध्यम से ...) लेकिन फिर मैं चाहता हूं कि वह आसानी से उसी स्लाइड पर वापस आएं।

तो मुझे ऐसा कुछ चाहिए?

app.get('/auth/google', function(req,res) { 
    var cust = "http://localhost:1338/"+req.params.xxx; 
    passport.authenticate('google', returnURL:cust, function ... 
} 

मैंने पासपोर्ट की मार्गदर्शिका पढ़ी है, लेकिन अभी भी यह नहीं पता कि यह कैसे करें। मुझे पता है कि यह सुरक्षित नहीं होगा, लेकिन मैं इसे और कैसे कर सकता हूं?

या मैं एप्लिकेशन को उस पृष्ठ पर वापस लौटने के लिए कैसे कर सकता हूं जहां से लॉगिन शुरू किया गया है? या AJAX का उपयोग करके ओपनआईडी प्रमाणीकरण करने का कोई तरीका है (और फिर भी पासपोर्ट का उपयोग करने में सक्षम हो)?

उत्तर

24

मैं अपने ऐप्स ट्विटर प्रमाणीकरण के लिए इस खोज निकाला है कॉलबैक में res.redirect('back'); प्रयास करें, मुझे यकीन है कि GoogleStrategy काफी समान है हूँ।

मान लिया जाये कि आप (पासपोर्ट गाइड से) तो जैसे प्रमाणीकरण सेवा से कॉलबैक के लिए मार्ग को परिभाषित किया है::

app.get('/auth/twitter/callback', 
    passport.authenticate('twitter', { 
     successRedirect: authenticationRedirect(req, '/account') 
    , failureRedirect: '/' 
    }) 
); 

बस इस लिए कि ब्लॉक बदलने के लिए:

app.get('/auth/twitter/callback', function(req, res, next){ 
    passport.authenticate('twitter', function(err, user, info){ 
    // This is the default destination upon successful login. 
    var redirectUrl = '/account'; 

    if (err) { return next(err); } 
    if (!user) { return res.redirect('/'); } 

    // If we have previously stored a redirectUrl, use that, 
    // otherwise, use the default. 
    if (req.session.redirectUrl) { 
     redirectUrl = req.session.redirectUrl; 
     req.session.redirectUrl = null; 
    } 
    req.logIn(user, function(err){ 
     if (err) { return next(err); } 
    }); 
    res.redirect(redirectUrl); 
    })(req, res, next); 
}); 
इस का एक संस्करण का प्रयास करें

अब, इस तरह सत्र में मूल URL स्टोर करने के लिए प्रमाणीकृत मार्गों के लिए अपने मिडलवेयर को परिभाषित:

ensureAuthenticated = function (req, res, next) { 
    if (req.isAuthenticated()) { return next(); } 

    // If the user is not authenticated, then we will start the authentication 
    // process. Before we do, let's store this originally requested URL in the 
    // session so we know where to return the user later. 

    req.session.redirectUrl = req.url; 

    // Resume normal authentication... 

    logger.info('User is not authenticated.'); 
    req.flash("warn", "You must be logged-in to do that."); 
    res.redirect('/'); 
} 

काम करता है!

+0

यह पूरी तरह से काम करता है, लेकिन रीडायरेक्ट पर यह हैश पैरामीटर गायब प्रतीत होता है यदि उपयोगकर्ता को प्रमाणित करने के लिए भेजा गया है और वापस आ गया है। लॉग इन करने के बाद रीडायरेक्ट करते समय यूआरएल में रखने के लिए कुछ तरीका हो सकता है? http://stackoverflow.com/questions/14124932/passport-js-express-js-forward-user-to-original-destination-after-authenticati – prototype

+0

@ user645715 शायद 'req.session.redirectUrl = req.originalUrl का उपयोग करने का प्रयास करें ; 'इसके बजाय या 'req.url' –

+0

एक आकर्षण की तरह काम करता है, धन्यवाद :) – Zub

5

के लिए passport.authenticate

+0

हा धन्यवाद! स्पष्ट रूप से बैक रूट पहले और दूसरे ओपनआईडी अनुरोध के बीच सेट किया गया है। मुझे यह नहीं पता था! धन्यवाद – bubersson

+2

अच्छी तरह से मुझे इसके साथ एक समस्या मिली। यह केवल तभी काम करता है जब मैं Google का उपयोग कर पहले ही लॉग इन हूं। यदि पासपोर्ट Google पेज पर रीडायरेक्ट करता है और फिर मेरी साइट पर वापस लौटाता है - "पृष्ठ" मार्ग खो जाता है। क्या Google से मेरे स्थान पर लौटने के लिए इसे मजबूर करने का कोई अन्य तरीका है (जिस पृष्ठ से लॉगिन शुरू किया गया है)? – bubersson

+0

@bubersson आपको पहले उत्तर पर एक जैसे अधिक सक्रिय दृष्टिकोण का उपयोग करना होगा, इसके लिए, यदि मैं सही ढंग से समझता हूं। – matanster

3

लेखक के मुताबिक ओपनआईडी रणनीतियों के साथ यह संभव नहीं है। हम सीधे चर तक पहुंच कर गतिशील रूप से इन अद्यतन करने में कामयाब रहे:

app.get('/auth/google', function(req, res, next) { 
    passport._strategies['google']._relyingParty.returnUrl = 'http://localhost:3000/test'; 
    passport._strategies['google']._relyingParty.realm = 'http://localhost:3000'; 
    passport.authenticate('google')(req, res, next); 
}); 
13

जहाँ भी आप अपनी प्रवेश बटन है, एक क्वेरी पैरामीटर के रूप में अनुरोध के वर्तमान URL संलग्न (जो भी templating प्रणाली आप उपयोग के लिए समायोजित):

<a href='/auth/google?redirect=<%= req.url %>'>Log In</a> 

फिर, req.session में अपने GET /auth/google हैंडलर को मिडलवेयर जोड़ने है कि इस मूल्य को संग्रहीत करता है:

app.get('/auth/google', function(req, res, next) { 
    req.session.redirect = req.query.redirect; 
    next(); 
}, passport.authenticate('google')); 

अंत में, आपके कॉलबैक हैंडलर में, सत्र में संग्रहीत यूआरएल पर रीडायरेक्ट करें:

app.get('/auth/google/callback', passport.authenticate('google', 
    failureRedirect: '/' 
), function (req, res) { 
    res.redirect(req.session.redirect || '/'); 
    delete req.session.redirect; 
}); 
+0

क्या सत्रों के बिना ऐसा करना संभव है? – nahtnam