【问题标题】:How to handle and validate sessions between the backend and the frontend如何处理和验证后端和前端之间的会话
【发布时间】:2019-09-12 18:22:03
【问题描述】:

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

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

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

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")
})

【问题讨论】:

    标签: javascript node.js reactjs express session


    【解决方案1】:

    您在重复一些事情: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 ;))。至少对它们进行哈希处理,如果您想正确地使用每个用户的盐对它们进行哈希处理。

    【讨论】:

    • 我认为会话在发送到服务器后会以某种方式加密以确保用户 ID
    • 是的,加密通信通道use HTTPS
    • 对会话进行哈希/加密是没有意义的,它很快就会被丢弃,所以加密它没有意义。您所要做的就是确保只有您的用户知道会话(使用 HTTPS 和正确的密码检查)
    • 如果是这种情况,为什么会出现会话最大值?根据我的处理方式,我必须在一段时间后手动编写代码来删除会话。
    • 会话超时,因为您假设多人使用同一设备或确实可以访问它。如果有人在一年前使用此浏览器登录了他的银行帐户,那么您今天不想信任该浏览器。
    猜你喜欢
    • 2018-02-25
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多