У меня есть код node.js, который использует стратегию паспорта openId connect для аутентификации. После аутентификации он перенаправляет обратно на исходный URL-адрес, однако, если я отправляю форму с POST по истечении сеанса, он не перенаправляет обратно на исходный URL-адрес как операцию POST, а изменяет ее на запрос GET.

Я хочу знать, есть ли какой-нибудь способ, где я могу сохранить тип запроса и после аутентификации он выполняет ту же операцию.

мой код app.js выглядит так:

app.get('/login', passport.authenticate('openidconnect', {})); 

function ensureAuthenticated(req, res, next) {
    if (!req.isAuthenticated()) {
        req.session.originalUrl = req.originalUrl;
        res.redirect('/login');
    } else {
        return next();
    }
}

app.get('/auth/sso/callback',function(req, res, next) {
    var redirect_url = req.session.originalUrl;
    passport.authenticate('openidconnect', {
        successRedirect: redirect_url,
        failureRedirect: '/failure',
    })(req,res,next);
});

PS: Аутентификация и другие общие перенаправления работают нормально .. проблема только с отправкой формы POST.

2 ответа2

2

Проблема здесь в том, что при выполнении исходного запроса POST он (вероятно) имеет тело с пост-данными. Проверка ensureAuthenticated перенаправляет на страницу входа и, таким образом, теряет указанные пост-данные!

После успешной аутентификации, когда вы перенаправляете на исходный URL-адрес, невозможно узнать, какие пост-данные отправлять с помощью запроса POST.

Один из способов, который я могу придумать, - отслеживать последний использованный URL-адрес GET-запроса, сохранить его в сеансе и использовать его в своем "после перенаправления входа в систему" и, таким образом, вернуться на страницу перед отправкой запроса POST. Это означает, что да, к сожалению, ваш пользователь должен снова заполнить форму (поскольку вы должны каким-то образом "перестроить" данные поста, которые вы потеряли).

Это можно сделать, добавив в приложение обработчик use который сохраняет URL-адрес tbe в объекте сеанса, если запрос имеет тип GET. Я хотел бы предоставить фрагмент кода для вас, но, к сожалению, я нахожусь на моем мобильном телефоне в отпуске, поэтому я боюсь, что это может быть немного трудно сделать, извините :(

0

Я нашел способ обойти это. Сейчас я сохраняю параметры POST в глобальных переменных, а затем вызываю функцию suredAuthentication.

После функции suredAuthentication он перенаправляет на исходный URL-адрес в виде запроса GET, но, поскольку у меня есть параметры записи, хранящиеся в глобальной переменной, я могу продолжить свои операции.

Спасибо за вашу идею, хотя .. Это что-то попробовать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .