Javascript 如何处理和验证后端和前端之间的会话

Javascript 如何处理和验证后端和前端之间的会话,javascript,node.js,reactjs,express,session,Javascript,Node.js,Reactjs,Express,Session,我已经为用户注册和登录创建了一个后端,我不知道如何在后端处理和验证会话 我读了一些关于如何生成会话令牌的文章,但我不知道在发送到服务器端询问一些信息时如何验证该令牌 这就是我所做的,将会话存储在每个用户的后端,然后使用手工制作的中间件询问此会话是否为该用户创建,我知道这是低效的 router.post("/createUser",(req,res)=>{ const {Name, Email , Phone , Password, UserName} = req.body

我已经为用户注册和登录创建了一个后端,我不知道如何在后端处理和验证会话

我读了一些关于如何生成会话令牌的文章,但我不知道在发送到服务器端询问一些信息时如何验证该令牌

这就是我所做的,将会话存储在每个用户的后端,然后使用手工制作的中间件询问此会话是否为该用户创建,我知道这是低效的

router.post("/createUser",(req,res)=>{
    const {Name, Email , Phone , Password, UserName} = req.body
    console.log(Email,Phone,Password)
    if(Name && Email && Phone && Password){
        const user = new UserModel({Name,Email,Phone,Password,UserName})
        user.save((e)=>e? console.log(e): console.log("success"))
        const Session = new SessionModel({userID:user._id,session:req.sessionID})
        Session.save()
        res.status(201).send(req.sessionID)
    }else{
        res.status(500).send()
    }
})
这就是我验证请求的方式

router.use("/profile",(req, res , next)=>{
    const {SessionID , UserID} = req.query

    SessionModel.findOne({userID:UserID},(err,session)=>{
        if(session.session === SessionID){
            next()
        }else{
            return res.status(500).send()
        }
    })})


router.get("/profile",(req,res)=>{
    res.send("works")
})

您的工作相当重复:express sessions已经为您管理了会话,将这些会话复制到数据库中没有任何意义(如果您必须扩展到一台服务器之外,express sessions可以为您这样做)

实际上,您可以将用户ID存储在会话中,然后检查会话中是否存在用户ID以验证请求。如果需要访问用户数据,只需根据id查找用户即可

 router.post("/createUser",(req,res) => {
   // ...
   req.session.userID = user._id;
   //...
 });

 router.use((req, res, next) => {
   if(!req.session.userID)
     return res.status(403).send("not logged in");
  next();
 });

 // all routes are secured beyond this point

必须注意:永远不要在数据库中存储纯文本密码(也就是不要像Facebook;))。如果你想正确地处理它们,至少要对它们进行散列。用每用户的salt对它们进行散列。

你是在复制东西:express sessions已经为你管理了会话,将这些会话复制到数据库中是没有意义的(如果你必须扩展到一台服务器之外,express sessions可以为你做到这一点)

实际上,您可以将用户ID存储在会话中,然后检查会话中是否存在用户ID以验证请求。如果需要访问用户数据,只需根据id查找用户即可

 router.post("/createUser",(req,res) => {
   // ...
   req.session.userID = user._id;
   //...
 });

 router.use((req, res, next) => {
   if(!req.session.userID)
     return res.status(403).send("not logged in");
  next();
 });

 // all routes are secured beyond this point

必须注意:永远不要在数据库中存储纯文本密码(也就是不要像Facebook;))。至少要对它们进行散列,如果你想正确的话。用每用户一次的salt对它们进行散列。

我认为会话是以某种方式加密的,一旦发送到服务器,它会被解密以确保用户的合法性,要加密通信通道,对会话进行散列/加密没有任何意义,它很快就会被丢弃,所以加密它是没有意义的。你所要做的就是确保只有你的用户知道会话(使用HTTPS和正确的密码检查),如果这是会话maxage存在的原因?。根据我的操作方式,我必须手动编写代码,在一段时间后删除会话。会话超时,因为您假设多人使用同一设备或确实可以访问它。如果有人在一年前使用此浏览器登录到他的银行帐户,您今天就不想信任此浏览器。我认为会话在发送到服务器后会以某种方式进行加密,并对其进行解密以确保用户的身份,为了加密通信通道,对会话进行哈希/加密没有任何意义,它很快就会被扔掉,所以加密它毫无意义。你所要做的就是确保只有你的用户知道会话(使用HTTPS和正确的密码检查),如果这是会话maxage存在的原因?。根据我的操作方式,我必须手动编写代码,在一段时间后删除会话。会话超时,因为您假设多人使用同一设备或确实可以访问它。如果有人在一年前使用此浏览器登录到他的银行帐户,您现在不想信任此浏览器。