как защитить маршруты в api и в клиенте с помощью next-auth

Я запускаю бэкэнд и интерфейс, которые обслуживаются экспресс-сервером на порту 8080 и интерфейсом на порту 80.

/api/route1        returns 200ok with json
/api/route2        returns 200ok with json 

Таким образом, приложение отлично работает, получая эти маршруты. Теперь о том, с чем мне нужна ваша помощь. Я добавил next-auth, чтобы в интерфейсе я мог

const [ session, loading ] = useSession();

сделать что-то вроде

{!session && <p>You are not logged in</p>}

который работает, но я не понял, как защитить маршруты к api. Я хочу защитить маршруты route1 и route2 как во внешнем, так и в серверном интерфейсе. Я думаю, когда я вошел в систему, мне нужно передать токен в api, но как я могу заставить эти 2 разговаривать друг с другом

/api/route1        returns 200ok with json
/api/route2        returns 200ok with json 

Помните, что я запускаю бэкэнд и интерфейс отдельно, потому что моя производственная сборка находится в докере, вот почему.

2 ответа

Вы можете найти пример этого в проекте next-auth-example

// pages/api/examples/protected.js
import { getSession } from 'next-auth/client'

export default async (req, res) => {
  const session = await getSession({ req })

  if (session) {
    res.send({ content: 'This is protected content. You can access this content because you are signed in.' })
  } else {
    res.send({ error: 'You must be sign in to view the protected content on this page.' })
  }
}

Если объект сеанса существует (т.е. не равен нулю), это означает, что у них либо есть действующий токен сеанса (при использовании сеансов базы данных), либо действительный подписанный веб-токен JSON (при использовании сеанса JWT).

В обоих случаях токен сеанса проверяется, чтобы убедиться, что он действителен и не истек.

Объект запроса req проходит через getSession() call при использовании таким образом, чтобы можно было проверить и проверить файл cookie, содержащий токен сеанса.

Способ обработки защищенных маршрутов в Node - использование промежуточного программного обеспечения.

Итак, допустим, у вас есть маршрут для добавления зарплаты сотрудников в базу данных, поэтому очевидно, что для такого маршрута нужен кто-то, кто является аутентифицированным администратором, верно?

  • Таким образом, вы можете создать функцию промежуточного программного обеспечения, подобную простой, приведенной ниже
const validateAdminCookie = (req, res, next)=>{

    //Here you then write all your logic on how you validate admin
    
    //Now you will have conditonals here that:

    if (!validatedCookie){

        return res.status(400).json({msg:'Not authorized'})
    }

    next();
}
  • Итак, теперь эта функция - это то, что вы передадите в своем маршруте, чтобы она выполнялась первой, и когда пользователь является действительным аутентифицированным администратором, тогда next() подтолкнет этого пользователя к основному маршруту, по которому они пытались перейти, иначе, если он не аутентифицирован, вернет сообщение о том, что он не аутентифицирован.

Теперь, как вы передаете это промежуточное ПО, показано ниже:

router.post('/api/admin-update-salaries',validateAdminCookie, (req, res)=>{

   //Now that **validateAdminCookie** will execute first and if all
   //checks out then user will be pushed down to the main part
   //that is this route here

})
Другие вопросы по тегам