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 }
大致如此。
浙公网安备 33010602011771号