Как перенаправить пользователя на URL после подтверждения пароля? - PullRequest
0 голосов
/ 22 января 2019

Идея:

У меня есть защищенный маршрут "/ me", и КАЖДЫЙ ВРЕМЯ пользователь пытается туда попасть, он должен ввести свой пароль (даже если пользователь уже вошел в систему).Если пароль правильный, то пользователь идет по маршруту "/ me".


Проблема:

Я использую экспресс.На маршруте "/ me" есть промежуточное программное обеспечение под названием "Подтверждение транзакции".И когда пользователь идет по пути «/ me», это промежуточное ПО перенаправляет пользователя на «/ Подтверждение транзакции? Redirect = / me», и пользователь может видеть поле, в котором он должен ввести свой пароль.

И в данный момент я не знаю, что делать, потому что, если пароль правильный, я пытаюсь перенаправить пользователя на маршрут "/ me" (я получаю этот маршрут из параметра "? Redirect = / me"), но промежуточное ПО снова перенаправляет его на "/ Подтверждение транзакции? redirect = / me".И пользователь никогда не сможет добраться до маршрута "/ me".


Вопрос:

Как я могу решить эту ситуацию?Я знаю, что должен использовать «next ()», если пароль правильный, но я не могу этого сделать, поскольку промежуточное ПО выполняет перенаправление, и у меня больше нет «next ()»


Вот некоторыекод:

const express = require('express');
const server = express();

const requestAuthorization = (req, res, next) => {
  res.redirect(301, `/confirm-transaction?redirect=${req.originalUrl}`);
};

server.get('/me', requestAuthorization, (req, res) => {
  res.status(200).send("this is /me route");
});

server.get('/confirm-transaction', (req, res) => {
  res.status(200).sendFile("password.html");
  // there is a form with field and button with POST method to '/confirm-transaction'
});

server.post('/confirm-transaction', (req, res) => {
  if (req.query.password === 'testpassword') { // it is a fake password (for testing)
     res.redirect(301, req.query.redirect);
  }
  res.redirect(301, `/confirm-transaction?redirect=${req.query.redirect}`);
});

1 Ответ

0 голосов
/ 22 января 2019

/me слепо перенаправляет на /confirm-transaction, несмотря ни на что.

Что вы можете сделать, это:
1. отправьте пользователю токен (или какой-нибудь) после успешной авторизации. Клиент сохраняет его, тогда следующий запрос должен иметь этот токен в заголовке.
2. Внутри requestAuthorization() проверьте, имеет ли заголовок запроса действительный токен. Если это так, не перенаправляйте, иначе перенаправляйте.

Примечание: в вашем случае вам может понадобиться перенаправить с токеном в заголовке.
Обратите внимание: что вы должны хранить токен где-нибудь, у кого есть доступ, чтобы сопоставить токен с пользователем.

...