Next.js Router разделение сайта на 2 основные ветки и защита паролем одной из них

Столкнулся с проблемой ( ну для меня проблема ) с роутингом на сайте на две основные ветки "/" и "/admin/" к тому же всю ветку admin мне надо защитить логином и паролем. Статей по этому поводу я не нашел совершенно, поэтому и пишу сюда. Подскажите как сделать это правильно, или поделитесь статьей. Буду очень благодарен!

PS. api у меня уже реализована. Ветки там где нужна авторизация он выдает ошибку. так вот как обернуть что-ли всю ветку admin кодом который проверяет наличие токена в куках, если его нет то переадрисация на авторизацию, если есть то запрос к api на корректность ну и тд. Это можно кидать на каждый файл в папке admin но выглядит это стремно.


Ответы (1 шт):

Автор решения: RTW

На заметку - в next.js свой роутер, поэтому от react-router вам лучше отказаться.

Чтобы реализовать авторизацию нужно обрабатывать запрос на сервере с помощью getServerSideProps:

function Page({ data }) {
  // Результат getServerSideProps
  if (!data.isAdmin) {
     location.href = '/authorization'
     return null
  }

  return 'Администраторская часть'
}

export async function getServerSideProps() {
  // Проверяем авторизацию
  const res = await fetch(`smth`)
  const data = await res.json()

  // Отправляем результат компоненту
  return { props: { data } }
}

export default Page

Вообще защищать нужно API, а не страницы.

// children - это ваша страница

function Layout({ children }) {
  // сюда загружаете профиль запросом к апи
  const [profile] = useState(null)

  useEffect(() => {
    // загружаем профиль
    // setProfile(результат)
  }, [])

  // Всё это оборачиваете в контекст
  return (
    <div>
      <div>хедер</div>
      <div>{children}</div>
      <div>футер</div>
    </div>
  )
}

function Page1() {
  return (
    <Layout>
      <div>Главная</div>
    </Layout>
  )
}
function Page2() {
  return (
    <Layout>
      <div>Админка</div>
    </Layout>
  )
}
→ Ссылка