电脑环境安装:node、npm、mongodb
项目环境安装:express、mongoose
npm install express --save
npm install mongoose --save
什么是express ?
Express 是 基于 Node.js 平台,快速、开放、极简的 Web 开发框架。
Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能。
Express 是最流行的 Node 框架,是许多其它流行 Node 框架 的底层库。
什么是mongoose ?
Mongoose是Nodejs的一个模块,这个模块可以操作MongoDB模块对数据库的操作
Mongooose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进一步的优化封装,并提供了更多的功能。
Mongoose,是MongoDB的一个对象模型工具,是基于node-mongodb-native开发的MongoDB的nodejs驱动,也是目前Node.js操作 MongoDB的首选库。
什么是JWT?
JWT 全称 JSON Web Token,是代替传统 session 认证的解决方案。其原理是服务端生成一个包含用户唯一标识的 JSON 对象,颁发给客户端。客户端请求需要权限的接口时,只要把这个 JSON 再原样发回给服务端,服务端通过解析就可识别用户。
JSON 对象通常是这样子:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYzNGY3MWZhMTU2MDRiZjdkNmVlOTc2NSIsInVzZXJuYW1lIjoieXl5IiwiaWF0IjoxNjY2MjMyMTM0fQ.NcnpkbY6JweWvJ-eDZS0X5lPDl1QI5FKBAeWpgf6CKQ
这个 JSON 对象通过点 . 分成三段,包含了请求头(加密算法)、负载信息(如 userId,过期时间),还有通过服务端密钥生成的签名来保证不被篡改。这种机制使服务端不再需要存储 Token,因此是非常轻量的用户认证方案。并且对于微服务这种需要不用服务间公用 Token 的跨域认证,JWT 是目前的首选。
什么是express-jwt?
express-jwt 是专用于 express 框架下解析 JWT 的中间件。它使用非常简单,而且会自动把 JWT 的 payload 部分赋值于 req.user,方便逻辑部分调用。
项目准备
新建一个文件夹,使用 npm init -y,对项目进行初始化操作,对项目依赖包进行管理。
-y的含义:yes的意思,在 init 的时候省去了敲回车的步骤,直接生成默认的 package.json
使用以下命令,安装本项目所需要的依赖包文件
npm install express --save
npm install mongoose --save
开启服务
1、新建一个 app.js 文件
const express = require('express');
const app = express();
app.get('/api/user', async (req, res) => {
res.send('hello node.js')
})
app.listen(3000, () => {
console.log('http://localhost:3000');
})
2、在命令行输入 node app.js,开启后台服务
3、在浏览器访问地址,http://localhost:3000/api/user,出现下图消息,代表后台服务开启成功。
实现简单的GET请求接口
app.get('/api/user', async (req, res) => {
res.send('hello node.js')
})
实现简单的POST请求接口
app.use(express.json()) // 设置后可以用 req.body 获取 POST 传入 data
app.post('/api/register', async (req, res) => {
console.log(req.body);
res.send('ok')
})
连接MongoDB数据库
1、在本电脑上,安装 mongodb 数据库,并开启服务
2、在根目录下新建 data/db.js 文件
// 引入 mongoose
const mongoose = require('mongoose')
// 连接数据库,自动新建 express_admin 库
mongoose.connect('mongodb://localhost:27017/express_admin', {
useNewUrlParser: true,
useUnifiedTopology: true
})
// 建立用户表
const UserSchema = new mongoose.Schema({
username: {
type: String,
unique: true
},
password: {
type: String,
}
})
// 建立用户数据库模型
const User = mongoose.model('User', UserSchema)
module.exports = { User }
const conn = mongoose.connection;
conn.on("error",error=>{
console.log("数据库连接失败:" + error);
})
conn.on("open",()=>{
console.log("数据库连接成功");
})
创建一个post请求,注册一个用户
const express = require('express');
const app = express();
const { User } = require('./data/db');
app.use(express.json()) // 设置后可以用 req.body 获取 POST 传入 data
// server.js
app.post('/api/register', async (req, res) => {
User.create({
username: req.body.username,
password: req.body.password
})
res.send('ok')
})
app.listen(3000, () => {
console.log('http://localhost:3000');
})
模拟用户发起POST请求,注册一个用户
@url=http://localhost:3000/api
POST {{url}}/register
Content-Type: application/json
{
"username": "llb",
"password": "123456"
}
数据库会自动创建好,并多了一条用户数据:
用户登录密码加密
在app.js中添加一个/login的post请求
app.post('/api/login', async (req, res) => {
const user = await User.findOne({
username: req.body.username
})
if(!user) {
return res.status(422).send({
message: '用户名不存在'
})
}
// compareSync 解密匹配,返回 boolean 值
const isPasswordValid = bcrypt.compareSync(
req.body.password,
user.password
)
if(!isPasswordValid) {
return res.status(422).send({
message: '密码不正确'
})
}
res.send({
user
})
})
登录jwt认证 token
1.安装jsonwebtoken依赖包
npm install jsonwebtoken --save
2.引入 jsonwebtoken,自定义密钥
const jwt = require('jsonwebtoken')
// 解析token用的密钥
const SECRET = 'token_secret'
3.在登录成功时,创建token
// jwt.sign() 接收两个参数,一个是传入的对象,一个是自定义的密钥
const token = jwt.sign({ id: String(user._id)}, SECRET)
res.send({
user,
token
})
4.发送请求测试时,可以看到创建好的token
解密token获取登录用户信息
1.在app.js中添加/profile的get请求
app.get('/api/profile', async (req, res) => {
const raw = String(req.headers.authorization.split(' ').pop())
// 解密token获取对应的id
const { id } = jwt.verify(raw, SECRET)
const result = await User.findById(id)
res.send(result)
})
2.模拟"yyy"用户发起一个/profile的get请求
@url=http://localhost:3000/api
get {{url}}/profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYzNGY3MWZhMTU2MDRiZjdkNmVlOTc2NSIsImlhdCI6MTY2NjE2OTUwMH0.1U0rSN0ARzVvdBgRLbFWnmUXOLgkGOjBoyoN76owPgk
3.发起请求测试时,可以看到yyy用户的信息,说明解密成功