安装依赖包

bcryptjs

用户注册,对密码进行加密,需要使用bcryptjs包,先来安装它

yarn add bcryptjs

jsonwebtoken

用户登录,生成token,需要安装jsonwebtoken

yarn add jsonwebtoken

dotenv

dotenv,可以用来配置环境变量,这里用来存储加密用的SECRET

yarn add dotenv

安装完成后,在项目根目录建一个.env文件,里面加上

SECRET=随便写一段字符串

例如:
SECRET=clwy.cn

在根目录app.js中引用

require('dotenv').config()

注册

var bcrypt = require('bcryptjs');

router.post('/', async function (req, res, next) {
  const name = req.body.name
  const password = req.body.password.toString()

  // 基础验证
  if (!name) {
    return res.json({status: false, msg: "用户名必须填写"})
  }

  if (!password) {
    return res.json({status: false, msg: "密码必须填写"})
  }

  let user = await models.User.findOne({where: {name: name}});
  if (user) {
    return res.json({status: false, msg: "用户名已经存在,请直接登录!"})
  }

  // 生成盐
  const salt = bcrypt.genSaltSync(10);

  // 对用户填写的密码进行加密
  const hash = bcrypt.hashSync(password, salt);
  const body = {
    ...req.body,
    password: hash
  }

  // 插入数据库中
  user = await models.User.create(body);
  res.json({
      status: true,
      data: {
        user: user
      }
    }
  );
});

登录

新建一个/routes/admin/auth.js 路由文件

var bcrypt = require('bcryptjs');
var jwt = require('jsonwebtoken');

router.post('/', async function (req, res, next) {
  const name = req.body.name
  const password = req.body.password

  // 检查账号
  const user = await models.User.findOne({where: {name: name}});
  if (!user) {
    return res.json({
      status: false,
      msg: '用户不存在,请先注册后再登录!'
    })
  }

  // 使用compareSync方法来检查密码是否正确
  const checkPassword = bcrypt.compareSync(password, user.password);
  if (!checkPassword) {
    return res.json({
      status: false,
      msg: '密码错误!'
    })
  }

  // 生成有效期为7天的 token
  // process.env.SECRET 是读取 .env 文件中填写的内容
  const token = jwt.sign({
    user: {
      id: user.id,
      name: user.name
    }
  }, process.env.SECRET, {expiresIn: 60 * 60 * 24 * 7});

  res.json({token: token})
});

验证登录

根目录下新建/middlewares/checkAuth.js文件

var jwt = require('jsonwebtoken');

module.exports = function (options) {
  return function (req, res, next) {
    // 如果没有提供 token,直接提示错误
    var token = req.headers.token;
    if (!token) {
      return res.status(401).send({
        success: false,
        message: '当前接口需要认证才能访问'
      });
    }

    // 验证token是否正确
    jwt.verify(token, process.env.SECRET, function (err, decoded) {
      if (err) {
        if (err.name == "TokenExpiredError") {
          return res.status(401).send({
            success: false,
            message: 'token已经过期,请重新登录!'
          });
        }

        if (err.name == "JsonWebTokenError") {
          return res.status(401).send({
            success: false,
            message: 'token 错误,请重新登录!'
          });
        }
      }

      // decoded里面装的是解密出来的是,之前加密生成token的东西
      // 解析出来的数据存入req
      req.decoded = decoded;
      next();
    })
  }
}

需要验证 token 的接口

app.js中,后台的路由中,添加上中间件

var checkAuth = require('./middlewares/checkAuth')

// ...
app.use('/admin/categories', checkAuth(), adminCategoriesRouter);

现在请求接口,就必须提供token才能访问了。
在各个路由文件中,可以使用req.decoded.user将登录时存储的用户信息读取出来。

参考

已添加到喜欢了