一、连接数据库创建集合规则
首先安装依赖 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)
})