2014-08-30 3 views
2

Я использую модуль паспорта узла-google-oauth и пытаюсь перенаправить страницу назад к исходному пути после успешной проверки подлинности, используя подход, основанный на сеансе, предложенный в Custom returnUrl on Node.js Passport's Google strategy , Тем не менее, я обнаружил, что в моем обратном вызове информация о перенаправлении, хранящаяся в сеансе, всегда была уничтожена, поэтому я был вынужден перенаправить на значение по умолчанию ('/' в этом случае).как перенаправить на исходную страницу после успешной проверки подлинности с помощью паспорта-google-oauth

Вот вывод журнала из моего фрагмента кода. Кажется, что когда он находится в обратном вызове, возврат был уничтожен. Это дизайн паспорта-google-oauth? Если да, то как можно перенаправить обратно на исходную страницу после успешной проверки подлинности?

// выход из

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

ответ

1

Я использую

res.redirect(req.headers.referer); 

, но проблема в том, иногда это работает, иногда это не, как если бы пользователь будет впервые регистрироваться через facebook, facebook сначала отобразит диалоговое окно разрешений, которое перезаписывает заголовок-референт var, но если пользователь уже предоставил разрешение вашему приложению, он будет исправлен обратно на URL-адрес, откуда бы они ни появились.

SBE - Извините за Bad английском;)

1

Можно также хранить первый URL в сессии, только если переменная в настоящее время не установлен. Затем отправьте логин, если этот параметр установлен, затем перейдите к нему.

Это лучше, чем заголовок, который может быть неточным от стороннего производителя.

В Java я бы сделал это в фильтре (проверьте переменную сеанса, скажем redirect_to или first_url, если его значение null и установите его, если не страница входа/регистрации). В узле JS можно использовать промежуточное программное обеспечение, как описано в https://stackoverflow.com/a/13336055/1643558

Цитируя этот ответ: У меня есть промежуточный слой я использую с app.get('/account', auth.restrict, routes.account) который устанавливает redirect_to в сессии ... затем перенаправить в/Войти

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); 
Смежные вопросы