как защитить маршруты в 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
})