06-blog-用户登录

136 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

用户登录大致思路:

1. 验证接口权限
2.获取请求数据 Email password
3. 验证数据: email password输入的字段是否正确
4. 验证业务逻辑 : 用户是否存在+密码是否匹配
5. 返回数据: 生成token 并返回数据

image.png

router.post('/login',loginUser) 
当为/login时,启用控制器loginUser,查看res的json数据是否响应成功。

1. 获取请求数据

  let {email,password} = req.body.user;

2.验证数据字段是否合规

const validateLoginUser = (email,password)=>{
    let error ={}
    if(validator.isEmpty(password)){
        error.password="password不能为空"
    }
    if(validator.isEmpty(email)){
        error.email="email不能为空"
    }
    if(!validator.isEmpty(email)&&!validator.isEmail(email)){
        error.email="email格式不对"
    }
    let validate = Object.keys(error).length<1//true验证通过
    return {error,validate}
}

通过validate的布尔类型来判断数据类型是否存在error,存在任意一个都会回显到捕获错误中间件中。

let {error,validate} = validateLoginUser(email,password)
if(!validate){ //任意一个错误都会throw
       throw new HttpException(401,"用户数据校验失败",error)
}

3.验证业务数据

先拿到整条数据:

 const user = await User.findByPk(email) //拿到整条数据
 这里,如果user存在说明数据库中有账号为email的数据
 如果user为空,则说明数据库中根本没有该数据,也就没法登录

3.1email是否存在数据库中

如果user存在的话,就进行下一步验证,由于我事先已经存好了数据在数据库里,那就打印一下user查看它长什么样。

image.png

3.2password是否正确

验证密码是否正确的逻辑是:拿到该email在数据库中对应的密码,与(用户输入的登录密码)被加密后进行对比,如果==那验证成功。

为什么要加密再对比,因为之前我们在注册之后存入的密码数据就是以md5加密后的形式存在数据库当中的。

 let DbPassword = user.dataValues.password //拿到数据库的密码

为了方便比较,写一个方法直接return出是否匹配。

const matchPWD= (DbPassword,LoginPassword)=>{
        let loginpassword = md5Password(LoginPassword)
        console.log(loginpassword,"loginpassword");
        if(loginpassword==DbPassword){
           return true
        }
        return false
}

调用方法:

 const isMatch =await matchPWD(DbPassword,password)

如果相等/不等:

if(!isMatch){
        throw new HttpException(401,"用户密码输入错误","password is not matched")
   }
   else{
    delete user.dataValues.password; //删掉回显password这个敏感信息
       user.dataValues.token = await sign(user.dataValues.username,user.dataValues.email)
       return res.json({
        data:user.dataValues //回显时的数据无password,多了一个token
       })  
}

4.返回数据

image.png

查看到res的信息全部符合就说明登录接口也成功了。