Express + MongoDB注册登录token验证

一、连接数据库创建集合规则

首先安装依赖 npm install express mongoose

1、连接数据库
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/demo', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useCreateIndex: true
}).then(() => {
  console.log("数据库连接成功");
})
2、创建集合规则
const UserSchema = new mongoose.Schema({
  username: {
    type: String,
    unique: true    // 表示唯一键
  },
  password: {
    type: String
  }
})
const User = mongoose.model('User', UserSchema)

二、注册

1、安装加密模块npm install bcrypt,并修改集合规则
// 集合规则password添加set方法
password: {
    type: String,
    set(val) {
      // 返回同步hash加密10次后的值
      return bcrypt.hashSync(val, 10)
    }
  }
2、将json处理中间件放在接口最上方
// 使用express中间件处理json数据
app.use(express.json())
3、接口
// 注册
app.post('/api/register', async (req, res) => {
  const user = await User.create({
    username: req.body.username,
    password: req.body.password,
  })
  res.send(user)
})
4、注册成功存入已加密的密码
{
  "_id": "606ac9909467de1ed008468c",
  "username": "ceshiuser",
  "password": "$2b$10$Py0lNdlY2JZOWBfC3wkk4OLIIzsdWoDRsID1z9jqPa9qO3ewVvD8a",
  "__v": 0
}

三、登录

1、安装token模块npm install jsonwebtoken
const jwt = require('jsonwebtoken')
const SECRET = ‘jasdkljaskldjASKDJASKLJDKL’
2、密码验证生成token
// 登录
app.post('/api/login', async (req, res) => {
  const user = await User.findOne({
    username: req.body.username
  })
  if (!user) {
    return res.status(422).send({
      msg: '用户不存在'
    })
  }
  // 比较传过来的密码和数据库的密码是否一样,返回值为布尔值
  const isPasswordValid = bcrypt.compareSync(req.body.password, user.password);
  if (!isPasswordValid) {
    return res.status(423).send({
      msg: '密码错误'
    })
  }
  // 生成token
  const token = jwt.sign({
    id: String(user._id)
  }, SECRET)
  
  res.send({
    user,
    token
  })
})

四、通过请求头token获取用户信息

app.get('/api/profile', async (req, res) => {
  if (!String(req.headers.authorization)) {
    return res.status(425).send({
      msg: 'token不存在'
    })
  }
  // 获取请求头的token值
  const getToken = String(req.headers.authorization).split(' ').pop();
  // 解析出token
  const { id } = jwt.verify(getToken, SECRET)
  // 查询用户
  const user = await User.findById(id)
  res.send(user)
})

封装中间件复用

const auth = async (req, res, next) => {
  if (!String(req.headers.authorization)) {
    return res.status(425).send({
      msg: 'token不存在'
    })
  }
  // 获取请求头的token值
  const getToken = String(req.headers.authorization).split(' ').pop();
  // 解析出token,解构用户id
  const { id } = jwt.verify(getToken, SECRET)
  // 查询用户信息
  req.user = await User.findById(id)
  next()
}

调用

app.get('/api/profile', auth, async (req, res) => {
  res.send(req.user)
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容