Node.js - web框架express的用户登陆、注册和授权

需要用到的插件有:

npm i bcryptjs
npm i jswebtoken

运行文件server.js

const { User } = require('./models')
const express = require('express') //引用 express
const jwt = require('jsonwebtoken')

const app = express()  //导入后执行函数,返回实例

const SECRET = 'Hsr981222'

//允许express处理提交过来的数据
app.use(express.json())


app.get('/users',async function(req, res) {
  const users = await User.find()
  res.send(users)
})
//用户登陆、注册和授权
//注册
app.post('/register',async (req, res) => {
  const user = await User.create({
    username: req.body.username,
    password: req.body.password
  })
  res.send(user)
})

//登陆
app.post('/login',async (req, res) => {
  const user = await User.findOne({
    username: req.body.username
  })
  if(!user) {
    return res.status(422).send({
      "message": "用户不存在!"
    })
  }
  const isPasswordValid = require('bcryptjs').compareSync(
    req.body.password,
    user.password
  )
  if(!isPasswordValid) {
    return res.status(422).send({
      "message": "密码无效!"
    })
  }
  //生成token
  const token = jwt.sign({
    id: String(user.id),
  }, SECRET)
  res.send({
    user,
    token
  })
})

//中间键
const auth = async (req, res, next) => {
  const raw = String(req.headers.authorization).split(' ').pop()
  const { id } = jwt.verify(raw, SECRET)
  req.user = await User.findById(id)
  next()
}

app.get('/profile', auth, async (req, res) => {

  res.send(req.user)
})


app.listen(3000, () => {   //监听实例
  console.log('App listening on port 3000!');
  
})

请求测试文件test.html

//定义变量
//请求之间需要使用三个#号隔开 ###
@uri = http://localhost:3000/

@json = Content-Type: application/json

### 用户的登陆、注册和授权
### 所有用户
GET {{uri}}users
### 注册
POST {{uri}}register
{{json}}

{
  "username": "user8",
  "password": "123456"
}
### 登陆
POST {{uri}}login
{{json}}

{
  "username": "user8",
  "password": "123456"
}

### 个人信息

GET {{uri}}profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVlM2M3NDc4YjljNDFlMWU3OGFkNGM2YSIsImlhdCI6MTU4MTAyMDI4Nn0.PVqEAlIyceBRxOIHQs3jXlx-6p_WUtc7dDdAZ81Vm1k

MongoDB的模型文件:model.js

const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/express-auth', {
  useCreateIndex: true,
  useNewUrlParser: true,
  useUnifiedTopology: true
}).then(res => {
  console.log('数据库连接成功')
})
const UserSchema = new mongoose.Schema({
  username: { type: String, unique: true },
  password: { type: String, set(val) {
    return require('bcryptjs').hashSync(val, 10)
  }}
})
const User = mongoose.model('User', UserSchema)
//删除库
// User.db.dropCollection('users')

module.exports = { User }

大致如此。

posted @ 2020-02-07 04:42  ''JoJo  阅读(613)  评论(0)    收藏  举报