如何使用passport-google-oauth成功validation后redirect到原始页面

我正在使用node passport-google-oauth模块,并尝试使用基于会话build议的Node.js Passport的Google策略中的自定义returnUrl成功进行身份validation后,将页面redirect回原始path。 但是,我发现在我的callback中,存储在会话中的redirect信息总是被删除,所以我被迫redirect到默认值(在这种情况下是“/”)。

这里是我的代码片段的日志输出。 看起来在callback中,returnTo被消灭了。 这是一个护照的devise谷歌oauth? 如果是这样,authentication成功后又怎么能redirect到原来的页面呢?

//从输出

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 

//代码片段

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

我用

 res.redirect(req.headers.referer); 

有时问题有时它有用它不像用户将通过Facebook第一次login,Facebook将首先显示权限对话框覆盖referer头var,但如果用户已经授予您的应用程序的权限,他/她将无论他们来自哪里,都可以重新链接到url。

SBE – 抱歉,英语不好;)

也可以在会话中存储第一个URL,只有当前没有设置该variables。 然后login,如果这个variables设置,然后重新指向。

这比从第三方oauth可能不准确的标题更好。

在Java中,我会做一个filter(检查会话variables,如redirect_to或first_url,如果它的空然后设置它,如果不是login/注册页面)。 在节点j中可以使用中间件,如https://stackoverflow.com/a/13336055/1643558中所述

引用这个答案:我有一个中间件,我用app.get('/account', auth.restrict, routes.account)在会话中设置redirect_to …然后我redirect到/ login

 auth.restrict = function(req, res, next){ if ( !req.session.userid ) { req.session.redirect_to = '/account'; res.redirect('/login'); } else { next(); } }; 

然后在routes.login.post我做到以下几点:

 var redirect_to = req.session.redirect_to ? req.session.redirect_to : '/'; delete req.session.redirect_to; //is authenticated ? res.redirect(redirect_to);