Пользовательский returnUrl в Node.js Паспорт стратегии Google
Я использую стратегию OpenID Google Express и Passport OpenID, и я хотел бы установить returnURL для каждого запроса auth, чтобы иметь возможность вернуться на страницу, инициировавшую этот auth.
Ситуация заключается в том, что у меня есть приложение слайдов HTML5 с Node.js бэкэнд (и с социальным материалом и редактором, а также Portal и расширениями... 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 ...
}
Я прочитал руководство Passport, но до сих пор не знаю, как это сделать. Я знаю, что это будет небезопасно, но как еще я могу это сделать?
Или как я могу заставить приложение вернуться на страницу, откуда был начат вход? Или есть способ сделать аутентификацию OpenID с использованием AJAX (и все еще иметь возможность использовать паспорт)?
Ответы
Ответ 1
Я понял это для аутентификации в моих приложениях 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 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('/');
}
Работы!
Ответ 2
Если у вас есть кнопка входа в систему, добавьте текущий 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;
});
Ответ 3
Попробуйте res.redirect('back');
в обратном вызове для passport.authenticate
Ответ 4
По мнению автора, это невозможно с помощью стратегий 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);
});