2012-03-27 5 views
17

Ich benutze ExpressID und Passport OpenID Google-Strategie und ich würde ReturnURL auf jede Auth Anfrage setzen, um zu der Seite zurückkehren, die diese Auth initiierte.Benutzerdefinierte ReturnUrl auf Node.js Passport Google-Strategie

Die Situation ist, dass ich HTML5 Folien Anwendung mit Node.js Backend (und mit Social Stuff und Editor und Portal und Erweiterungen ... https://github.com/bubersson/humla) und ich möchte in der Lage sein, Benutzer auf einer Folie (über Folie Menü ...) aber dann will ich, dass er leicht zur selben Folie zurückkommt.

Also würde ich so etwas brauchen?

Ich habe Passport Leitfaden gelesen, aber immer noch nicht wissen, wie das geht. Ich weiß, das wäre nicht sicher, aber wie könnte ich es sonst tun?

Oder wie kann ich die Anwendung zu der Seite zurückkehren, von der die Anmeldung initiiert wurde? Oder gibt es eine Möglichkeit, die OpenID-Authentifizierung mit AJAX zu machen (und trotzdem den Pass zu verwenden)?

Antwort

24

ich dieses heraus für meine apps Twitter-Authentifizierung dachte ich, ich bin sicher, dass die GoogleStrategy sehr ähnlich ist. Versuchen Sie, eine Variante dazu:

Angenommen, Sie die Route für den Rückruf von dem Authentifizierungsdienst wie so definiert haben (von den Passführern):

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

Genau diesen Block zu diesem ändern:

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); 
}); 
Jetzt

, definieren Sie Ihre Middleware für authentifizierte Routen die ursprüngliche URL zu speichern, in der Sitzung wie folgt aus:

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('/'); 
} 

Funktioniert!

+0

Das funktioniert perfekt, aber bei Redirect scheint es die Hash-Parameter zu verpassen, wenn der Benutzer weggeschickt wird, um sich zu authentifizieren und zurückkommt. Könnte es einen Weg geben, diese nach der Anmeldung beim Weiterleiten in der URL zu belassen? http://stackoverflow.com/questions/14124932/passport-js-express-js-forward-user-to-original-destination-after-authenticati – prototype

+0

@ user645715 vielleicht versuchen, 'req.session.redirectUrl = req.originalUrl zu verwenden ; 'statt oder' req.url' –

+0

funktioniert wie ein Charme, danke :) – Zub

5

res.redirect('back'); in der Callback-Versuchen für passport.authenticate

+0

Ha danke! Anscheinend wird die Backroute zwischen der ersten und der zweiten OpenID-Anfrage eingestellt. Das wusste ich nicht! Danke – bubersson

+2

Nun, ich habe ein Problem damit gefunden. Es funktioniert nur, wenn ich bereits mit Google eingeloggt bin. Wenn der Pass auf die Google-Seite umleitet und dann auf meine Website zurückkehrt, ist die Route "Seite" verloren. Gibt es eine andere Möglichkeit, um die Rückkehr von Google zu meinem Standort (die Seite, von der die Anmeldung initiiert wurde) zu erzwingen? – bubersson

+0

@Bubersson Sie müssten einen proaktiveren Ansatz wie den auf der ersten Antwort verwenden, dafür, wenn ich das richtig verstehe. – matanster

3

Laut dem Autor ist dies mit OpenID-Strategien nicht möglich. Wir haben es geschafft diese dynamisch zu aktualisieren, indem Sie direkt auf die Variablen zugreifen:

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

Überall dort, wo Sie Ihre Login-Button haben, fügen Sie die aktuelle URL als Abfrageparameter Anforderung (justieren für was auch immer Template-System Sie verwenden):

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

Dann fügen Sie Middleware zu Ihrem GET /auth/google Handler, dass dieser Wert in req.session speichert:

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

Schließlich, in Ihrem Callback-Handler, Umleitung auf die URL in der Sitzung gespeichert:

+0

Ist es möglich, dies ohne Sitzungen zu tun? – nahtnam