Следующая JS express jwt аутентификация - PullRequest
1 голос
/ 23 февраля 2020

Я ввел /api/login для входа в систему. У меня также есть страница login.js, которая отправляет данные формы в API входа в систему. Мой логин api проверяет учетные данные пользователя в моей базе данных, а затем подписывает токен и сохраняет его для повара ie. Мой /api/login:

await authCollection.findOne(
  {
    authCode: req.body.authcode,
  },
  function(err, doc) {
    if (err) throw err;
    if (!doc) return res.status(400).send('auth not found');
    if (doc) {
      const token = jwt.sign({ _id: doc._id }, process.env.TOKEN_SECRET);
      res
        .status(200)
        .cookie('token', token, {
          maxAge: 2 * 60 * 60 * 1000,
          httpOnly: false,
        })
        .send(token);
    }
  },
);

Я могу защитить свои маршруты API с помощью промежуточного программного обеспечения, как это:

function(req, res, next) {
  const token = req.cookies.token || '';
  if (!token) {
    return res.status(401).send('Access denied');
  }

  try {
    const decrypt = jwt.verify(token, process.env.TOKEN_SECRET);
    req.user = {
      id: decrypt.id,
      firstname: decrypt._id,
    };
    next();
  } catch (err) {
    res.status(400).send('Invalid token');
  }
}

Я не понимаю, как я могу защитить обычные страницы, которые в моем каталоге /pages. Может ли кто-нибудь дать мне подсказку в правильном направлении? Я уже погуглил и прочитал каждую страницу, но не смог реализовать

1 Ответ

0 голосов
/ 24 февраля 2020

Зависит от того, что я написал: ho c privateArea, который возвращает новый компонент, который выбирает пользователей accessToken из API, затем декодирует его, если пользователь вошел в систему, отображает завернутую страницу в противном случае выдает сообщение «Запретная зона».

export function privateArea(PageComponent) {
  const PrivateArea = ({ accessToken, pageProps }) => {
    const user = decodeToken(accessToken);
    if (user) {
      return <PageComponent {...pageProps} />;
    } else {
      return <RestrictedArea />;
    }
  };

  PrivateArea.getInitialProps = async (...args) => {
    const accessToken = await api.getAccessToken();

    if (typeof PageComponent.getInitilProps === 'function') {
      const pageProps = await PageComponent.getInitilProps(...args);
    }
    return {
      accessToken,
      pageProps: pageProps || {},
    };
  };
  return PrivateArea;
}
...