Я пытаюсь добавить аутентификацию SAML, используя паспорт-saml для моего приложения. Я использую Angular для маршрутизации. При загрузке главной страницы я проверяю пользователя через запрос GET на мой сервер узла "/auth", чтобы проверить req.user
, если он верен, я отправляю обратно в пользовательские данные; если false, я отправляю сообщение об ошибке. У меня есть привязка данных к этому ответу данных пользователя, поэтому в случае отсутствия пользовательских данных я все же показываю кнопку "Вход".
При нажатии кнопки "Вход" я выполняю перенаправление на сервер узла "/login". Это делает функцию pass.authenticate, которая запускается, а затем связывается с "/assert", когда она завершается, чтобы выполнить перенаправление. ** Именно в этот момент у меня возникает проблема. ** Моя перенаправление всегда идет в "/", потому что Я выполняю перенаправление и используя угловую маршрутизацию, поэтому я не знаю, как сохранить этот маршрут, скажем "/myPage1" или "/myPage2". ПРИМЕЧАНИЕ. Я не хочу, чтобы вы всегда отправляли обратно в "/myPage1", я хочу иметь возможность "Вход" из любого вида в SPA.
Я иду об этом не так? Является ли это ограничением использования угловой маршрутизации?
$scope.login = function () {
window.location.href = 'http://example.com/login';
};
function getCreds() {
$http.get('http://example.com/auth', { withCredentials: true })
.then(function (response) {
$scope.creds = response.data;
});
}
app.get('/login', passport.authenticate('saml', { failureRedirect: '/login' }));
app.post("/assert", passport.authenticate('saml', { failureRedirect: '/login' }), function (req, res) {
// console.log('session' + JSON.stringify(req.session));
// console.log("original url " + req.session.originalUrl);
if (req.session.originalUrl) {
res.redirect(req.session.originalUrl);
}
else {
res.redirect('/');
}
});
app.get('/auth', function (req, res) {
var authenticated = req.user;
if (authenticated) {
res.send(req.user);
} else {
res.send({statusCode: 401, message: 'User session is not alive'});
}
});
Я нашел способ добиться желаемого эффекта.
Перед выполнением вызова "Вход" я делаю еще один вызов api в "/setSessionRedirectUrl", который передает текущий window.location.href с углового на узел сервера для хранения сеанса.
app.post('/setSessionRedirectUrl', function (req, res) {
req.session.samlLoginRedirectUrl = req.body.redirectUrl;
res.send();
});
Затем, когда функция assert запускается после входа в систему, она ищет перенаправление req.session.samlLoginRedirectUrl
. Оно работает!