Express 如何使用下一次身份验证保护api和客户端中的路由

Express 如何使用下一次身份验证保护api和客户端中的路由,express,next.js,next-auth,Express,Next.js,Next Auth,我运行一个后端和一个前端,这两个端都由express提供服务,后端在端口8080上,前端在端口80上 /api/route1 returns 200ok with json /api/route2 returns 200ok with json 因此,该应用程序可以很好地获取这些路线。现在谈谈我需要你帮助的事情。我已经添加了下一个auth,所以在前端我可以 const [ session, loading ] = useSession(); 做某事 {!sess

我运行一个后端和一个前端,这两个端都由express提供服务,后端在端口8080上,前端在端口80上

/api/route1        returns 200ok with json
/api/route2        returns 200ok with json 
因此,该应用程序可以很好地获取这些路线。现在谈谈我需要你帮助的事情。我已经添加了下一个auth,所以在前端我可以

const [ session, loading ] = useSession();
做某事

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

请记住,我分别运行后端和前端,因为我的productionbuild在docker中,这就是为什么。

处理节点内受保护路由的方法是使用中间件

假设您有一个在数据库中添加员工工资的路径,那么显然这样的路径需要一个经过身份验证的管理员,对吗

  • 因此,您可以创建一个如下所示的简单中间件功能
  • 现在,该函数是您将在路由中传递的,因此首先执行该函数,当用户是有效的经过身份验证的管理员时,
    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

})
你可以找到一个

//pages/api/examples/protected.js
从“下一个身份验证/客户端”导入{getSession}
导出默认异步(req,res)=>{
const session=wait getSession({req})
国际单项体育联合会(届会){
res.send({content:'这是受保护的内容。您可以访问此内容,因为您已登录。'})
}否则{
res.send({错误:'您必须登录才能查看此页面上受保护的内容。'})
}
}
如果会话对象存在(即不为null),则表示它们具有有效的会话令牌(如果使用数据库会话)或有效的签名JSON Web令牌(如果使用JWT会话)

在这两种情况下,都会检查会话令牌以确保其有效且未过期


以这种方式使用时,请求对象
req
将传递给
getSession()
调用,以便可以检查和验证包含会话令牌的cookie。

问题是关于下一次身份验证
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();
}
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

})