Node.js Как получить предыдущий URL - PullRequest
1 голос
/ 04 апреля 2020

Я хочу получить предыдущий URL, например, в всех моих /admin маршрутах. Я открываю форму, в которой администратору необходимо повторно ввести свой пароль, чтобы получить перенаправление на запрошенный маршрут, но проблема в том, что после того, как я проверил его пароль и попытался перенаправить его на маршрут, который он первоначально запрашивал, у меня больше нет этого маршрута, он утерян. Например, администратор запрашивает / admin / register, появляется форма, которая отправляет на validate-password, а затем, если он обнаруживает, что пароль соответствует (введен правильный пароль), он должен перенаправить пользователя на маршрут, который он когда-то запрашивал, но я не не знаю, как получить начальный маршрут, который он запрашивал

router.all('/admin/*', isAdmin, (req, res, next) => {
    res.render('validatePassword', {message: 'Please re-enter your password to get access to ' + req.originalUrl});
    // next();
});

router.get('/admin/register', (req, res) => {
    res.render('register', {message: req.flash('message'), role_id: req.user.role_id})
});


// Validate password, admin re-enter password to get access to /admin routes
router.post('/validate-password', async (req, res, next) => {
    const password = req.body.password;
    const match = await passwordController.comparePassword(password, req.user.password);
    console.log(password);
    if (match) {
        // return res.redirect('/' +); HOW DO I REDIRECT HERE
        return next();
    } else {
        // return res.render('changePassword', {role_id: req.user.role_id});
        return res.render('validatePassword', {message: 'Wrong password'});
    }
});

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Здесь:

router.all('/admin/*', isAdmin, (req, res, next) => {
    res.render('validatePassword', {message: 'Please re-enter your password to get access to ' + req.originalUrl});
    // next();
});

Когда вы go визуализируете эту страницу, можете ли вы присоединить исходный маршрут как локальный, как вы делаете с message? Вы должны быть в состоянии добавить req.originalUrl и передать его validatePassword. Затем, когда эта страница вызывает POST для проверки пароля, вы передаете URL перенаправления до него как часть тела.

0 голосов
/ 04 апреля 2020

Это то, для чего вы используете куки или сеансы на стороне сервера (которые также используют Cook ie). Вы аутентифицируете пользователя один раз, устанавливаете повара ie, а затем при последующих запросах от этого браузера, повара ie будут отправляться вместе с каждым запросом, и затем вы можете проверить этого повара ie, чтобы проверить, аутентифицированы ли они или не и решить, что они или не имеют права делать на основании этого. Вот как работает почти каждый сайт в Интернете, использующий имя входа.

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

Вам не нужно использовать express -session. Вы можете управлять поваром ie самостоятельно, но тогда вам необходимо убедиться, что повар ie правильно зашифрован (для этого JWT является популярной библиотекой), поэтому его может легко подделать мошеннический клиент. И любое состояние, которое вы хотите сохранить для пользователя, либо должно храниться в самом файле cook ie (куки должны быть не очень большими, поскольку они отправляются взад-вперед при каждом запросе http и хранятся в браузере), либо вам нужно было бы поместить зашифрованный идентификатор в cook ie, который вы можете использовать в качестве ключа для своего собственного объекта сеанса на стороне сервера.


Изменения добавлены после уточнения OP они уже используют express -сессион.

Обычно при входе в систему при переадресации вы отправляете строку запроса или скрытый элемент формы, который является исходным URL-адресом, на который пользователь хотел go. Затем форма входа в систему отправит эту строку запроса или скрытый элемент формы вместе с данными формы входа на сервер. После успешного входа в систему сервер перенаправляет вас на исходный целевой URL-адрес, на который пользователь хотел go. Таким образом, пользователи переходят на /admin/add, перенаправляются на /login, но эта форма входа содержит скрытый элемент формы /admin/add. Пользователь отправляет форму пароля.

Сервер проверяет pwd, затем получает исходный /admin/add url из формы входа и перенаправляет пользователя на этот URL. Ваша проверка подлинности для этого видит, что пользователь только что вошел в систему, поэтому ему разрешено продолжить.

...