03-博客api接口项目实战之用户登录

辰漪
2022-01-20 / 0 评论 / 26 阅读 / 正在检测是否收录...

1. 实现登录功能

所需字段:username password

所需npm包:jsonwebtoken 生成token express-jwt 解析token

npm install jsonwebtoken express-jwt

express-jwt官方文档:https://www.npmjs.com/package/express-jwt

jsonwebtoken官方文档:https://www.npmjs.com/package/jsonwebtoken

实现步骤
  • 定义登录字段校验规则对象
// schema/user.js
const joi = require('joi')
const reg_login = {
  body: {
    username: joi.string().alphanum().min(1).max(10).required(),
    password: joi.string().pattern(/^[\S]{6,12}$/).required()
  }
}
module.exports = {
    reg_login
}

登录和注册实际上都是校验username 和 password,可以共用,注意修改 用户注册路由验证

// 用户注册
router.post('/reguser', validateJoi(userSchema.reg_login), user_handler.regUser)
  • 创建路由
// router/user.js
// 添加登录路由
// 用户登录
router.post('/login', validateJoi(userSchema.reg_login), user_handler.login)
  • 创建路由处理函数

登录实现:

拿到用户名查询数据库有没有此人,没有,返回查无此人,有则继续下一步

拿到当前用户在数据库的密码,使用bcrypt和当前输入的密码进行对比,密码错误,返回密码错误,登陆失败,否则进行下一步

使用jsonwebtoken创建token,返回登陆成功以及token,再加上用户的基本信息

// router_handler/user.js
// 登录
const login = (req, res) => {
  const userInfo = req.body
  const sql = `select * from users where username = ?`
  // 查询用户在不在数据库中
  db.query(sql, userInfo.username, (err, result) => {
    if (err) return res.cc(err)
    if (result.length !== 1) return res.cc('登陆失败,查无此人!')
    // TODO:判断用户输入的登录密码是否和数据库中的密码一致
    const compareResult = bcrypt.compareSync(userInfo.password, result[0].password)
    if (!compareResult) return res.cc('密码错误,登录失败!')
    const user = { ...result[0], password: '' } // 将查询到的用户信息的密码剔除
    // 创建token jwt.sign(加密信息, 加密秘钥, 有效期)
    const token = jwt.sign(user, 'cjaliwbfsia1sa', {expiresIn: '24h'})
    res.send({
      status: 0,
      msg: '登陆成功!',
      userInfo: user,
      token: 'Bearer ' + token
    })
  })
}

可以将jwt加密秘钥和有效期抽离成一个文件 config.js,在根目录创建

// config.js
const jwtConfig = {
  jwtKey: 'cjaliwbfsia1sa', // jwt秘钥
  expiresIn: '24h' // token有效期
}
module.exports = {
  jwtConfig
}

哪里要用就引入

// 修改 登录路由
const { jwtConfig } = require('../config')
const token = jwt.sign(user, jwtConfig.jwtKey, {expiresIn: jwtConfig.expiresIn})
  • 测试登录接口: http://127.0.0.1:8086/api/login
  • 请求路径:/api/login
  • 请求方法:post
  • 请求参数:
请求参数参数类型参数说明备注
usernameString用户名不能为空 长度1-10位
passwordString密码不能为空 长度6-12位
0
选择打赏方式:
微信

评论 (0)

取消