Извините, если это вопрос о головной стороне, но у меня возникли проблемы с пониманием того, как я могу перенаправить клиентский браузер обратно на любой URL-адрес, который был первоначально запрошен после успешной проверки подлинности с нашим поставщиком идентификации SAML (IdP). Я использую последние версии паспорт-saml, паспорт и экспресс.
Например, скажем, что клиент изначально запросил /foo/bar
из ссылки на другой незащищенной странице, но поскольку это защищенный ресурс, я отвечаю перенаправлением на /login
, где я вызываю passport.authenticate('saml')
.
app.get('/login', passport.authenticate('saml'));
function ensureAuth(req, res, next) {
if (req.user.isAuthenticated()) {return next();}
else {res.redirect('/login');}
}
app.get('/foo/bar', ensureAuth, function(req, res) {
...
});
Этот вызов перенаправит браузер на мою страницу входа в систему IdP, и после успешной проверки подлинности IdP POST вернутся к моему маршруту /login/callback
. В этом маршруте я снова использую passport.authenticate(saml)
для проверки ответа SAML, и, если все это хорошо, я затем перенаправляю браузер обратно к запрашиваемому ресурсу... но откуда я знаю, что это за запрошенный ресурс? Поскольку это обратный вызов POST, я потерял любое состояние, связанное с исходным запросом.
app.post('/login/callback', passport.authenticate('saml'), function(req, res) {
res.redirect('...can I know which url to redirect back to?...');
});
Пример в паспорт-saml readme просто показывает жестко закодированное перенаправление на корневой ресурс, но я бы хотел перенаправить обратно в первоначально запрошенную URL (/foo/bar
).
Могу ли я отправить URL-адрес или какое-либо другое значение в IdP, который будет возвращаться в ответ на ответ SAML? И если да, то как я могу получить доступ к нему в моем маршруте /login/callback
?
Или есть ли какой-то лучший способ выразить/паспорт, чтобы я этого не делал?
Любая помощь, которую вы можете предоставить, будет оценена по достоинству!