wie man nach erfolgreicher Authentifizierung mit passport-google-oauth @ zur Originalseite umleit

Ich verwende das Node-Passport-Google-Oauth-Modul und versuche, die Seite nach erfolgreicher Authentifizierung mithilfe einer sitzungsbasierten Methode, die in @ vorgeschlagen wird, zum ursprünglichen Pfad zurückzuleiteCustom returnUrl über die Google-Strategie von Node.js Passport. In meinem Rückruf wurde jedoch festgestellt, dass die in der Sitzung gespeicherten Weiterleitungsinformationen immer gelöscht wurden, sodass ich gezwungen war, auf eine Standardeinstellung (in diesem Fall '/') umzuleiten.

Hier ist die Protokollausgabe von meinem Code-Snippet. Es scheint, als wäre die Rückgabe an, wenn sie sich im Callback befindet, ausgelöscht worden. Ist es ein Design des Passport-Google-Oauth? Wenn ja, wie kann man nach einer erfolgreichen Authentifizierung zur ursprünglichen Seite zurückkehren?

// Ausgabe von

Storing url: /newroom
in /auth/google, returnTo = /newroom
in /auth/google/callback, returnTo = undefined
Storing url: /newroom
in /auth/google, returnTo = /newroom
in /auth/google/callback, returnTo = undefined

// Code-Auszu

var express = require('express'),
[sic]
passport = require('passport'),
GoogleStrategy = require('passport-google-oauth').OAuth2Strategy,
cookieParser = require('cookie-parser'),
expressSession = require('express-session'),
bodyParser = require('body-parser'); 

passport.serializeUser(function(user, done) {
    done(null, user);
});

passport.deserializeUser(function(obj, done) {
    done(null, obj);
});

passport.use(new GoogleStrategy({
        clientID: GOOGLE_CLIENT_ID,
        clientSecret: GOOGLE_CLIENT_SECRET,
        callbackURL: 'http://' + MY_HOST + '/auth/google/callback',
    },
    function(accessToken, refreshToken, profile, done) {
        process.nextTick(function() {
            console.log('Profile:' + profile);
            return done(null, profile);
        });
    }
));

var auth = function(req, res, next){
    if (!req.session.user) {
        console.log('Storing url: ' + req.url);
        req.session.returnTo = req.url;
        res.redirect('/auth/google');
    } else if (!userIsValid(req.session.user)) {
        // handle invalid user
    } else {
        next();
    }
};

app.get('/auth/google', function(req, res, next) {
        console.log("in /auth/google, returnTo = " + req.session.returnTo);
        passport.authenticate('google',
            {
                scope: ['https://www.googleapis.com/auth/userinfo.profile',
                    'https://www.googleapis.com/auth/userinfo.email']
            }
        )(req, res, next)
    }
);

app.get('/auth/google/callback', function(req, res, next) {
    console.log("in /auth/google/callback, returnTo = " + req.session.returnTo);
    passport.authenticate('google', function(err, user, info) {
        console.log("in /auth/google/callback callback");
        if (err || !user) {
            res.redirect('/auth/google');
        } else {
            var returnTo = req.session.returnTo ? req.session.returnTo : '/';
            delete req.session.returnTo;
            console.log('Redirecting to: ' + returnTo);
            req.session.user = user;
            res.redirect(returnTo);
        }
    })(req, res, next);
});

Antworten auf die Frage(2)

Ihre Antwort auf die Frage