Пользовательский returnUrl в стратегии Google для паспорта Node.js - PullRequest
18 голосов
/ 27 марта 2012

Я использую Express и Passport OpenID для стратегии Google, и я хотел бы установить returnURL для каждого запроса авторизации, чтобы иметь возможность вернуться на страницу, инициировавшую эту аутентификацию.

Ситуация такова, что у меня есть приложение для слайдов HTML5 с бэкэндом Node.js (и с социальными материалами и редактором, и порталом, и расширениями ... https://github.com/bubersson/humla), и я хочу иметь возможность войти в систему пользователякакой-то слайд (через меню слайдов ...), но затем я хочу, чтобы он легко вернулся к тому же слайду.

Так что мне нужно что-то подобное?

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

Я прочиталРуководство по паспорту, но все еще не знаю, как это сделать. Я знаю, что это не будет безопасно, но как еще я могу это сделать?

Или как я могу заставить приложение вернуться на страницу сгде был инициирован вход в систему? Или есть ли способ сделать аутентификацию OpenID с использованием AJAX (и при этом иметь возможность использовать и паспорт)?

Ответы [ 4 ]

24 голосов
/ 18 мая 2012

Я понял это для своих приложений аутентификации Twitter, я уверен, что 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('/');
}

Работает!

14 голосов
/ 01 апреля 2014

Где бы у вас ни была кнопка входа, добавьте текущий URL-адрес запроса как параметр запроса (настроить для любой используемой вами системы шаблонов):

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

Затем добавьте промежуточное ПО в обработчик GET /auth/google, который сохраняет это значение в req.session

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

Наконец, в обработчике обратного вызова перенаправьте на URL-адрес, сохраненный в сеансе:

app.get('/auth/google/callback', passport.authenticate('google',
  failureRedirect: '/'
), function (req, res) {
  res.redirect(req.session.redirect || '/');
  delete req.session.redirect;
});
5 голосов
/ 28 марта 2012

Попробуйте res.redirect('back'); в обратном вызове для passport.authenticate

3 голосов
/ 02 января 2014

По мнению автора, это невозможно при использовании стратегий OpenID.Нам удалось обновить их динамически, напрямую обращаясь к переменным:

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