- 基于服务器渲染的传统web开发模式
优点:
缺点:
//服务器通过字符串的拼接,发送给前端
app.get("/user", function (req, res) {
const user ={name:'乞力马扎罗',age:'24'}
// res.send()方法,可以把处理好的json内容,发送给客户端
res.send(`姓名:
${user.name},年龄:${user.age}`)
})
- 基于前后端分离渲染的新型web开发模式
优点:
缺点:
基于服务器渲染和前后端分离的两种开发模式,分别有不同的身份认证方案
在Express项目中,只需要安装中间件,即可在项目中使用Session认证
express-session中间件安装成功后,需要通过app.use()来注册session中间件
//express-session中间件
//导入session中间件
const session = require('express-session')
//注册session
app.use(session({
secret: "key", //值,负责对session加密
resave: false, //固定写法
saveUninitialized: true, //固定写法
}))
- 配置成功后,即可通过req.session来访问和使用session对象,从而存储用户的关键信息
- 只有配置了express-session这个中间件,才能通过req点出来session这个属性
- 如果post请求,配置这个app.use(express.urlencoded({extended:false})),不然post请求是空
//express-session中间件
//导入session中间件
const session = require('express-session')
// 导入express
const express = require('express')
// 创建web服务器
const app = express()
// 启动文本服务器
app.listen(80,()=>{
console.log("80服务器启动")
})
//注册session
app.use(session({
secret: "key", //值,负责对session加密
resave: false, //固定写法
saveUninitialized: true, //固定写法
}))
//配置这个,不然post请求是空
app.post('/login', (req, res) => {
if (req.body.name !== '乞力马扎罗' || req.body.password !== '111111') {
return res.send({
'status': 0,
msg: "登录失败"
})
}
//只有配置了express-session这个中间件,才能通过req点出来session这个属性
//通过 req.session追加任何属性
req.session.user = req.body
req.session.islogin = true
res.send({
'status': 1,
msg: "登录成功"
})
})
//向session中取数据
app.post('/getuserinfo', (req, res) => {
console.log(req.session.user)
// 判断用户是否登录
if (!req.session.islogin) {
res.send({
'status': 0,
msg: "请登录"
})
return
}
res.send({'status':1, data:req.session.user})
})
- 调用req.session.destroy()函数,即可清空服务器保存的session信息·
- 只会清空调用这个的当前用户的session信息,而不是清空所有的session信息
- 调用场景,退出登录
app.post('/outlogin', (req, res) => {
req.session.destroy()
res.send({'status':1, msg:'退出成功'})
})
JWT,全称:JSON Web Token,是目前最流行的跨域认证解决方案
Authorization: Bearer <token>
npm install jsonwebtoken express-jwt
const jwt = require("jsonwebtoken")
const expressjwt = require("express-jwt")
定义secret秘钥
const jwt = require("jsonwebtoken")
const {expressjwt} = require("express-jwt")
//定义secret秘钥,
const secretKey="adminpossword"
app.post('/jwtlogin', (req, res) => {
let user=req.body
if (req.body.name !== '乞力马扎罗' || req.body.password !== '111111') {
return res.send({
'status': 0,
msg: "登录失败"
})
}
//调用jwt.sign()生成JWT字符串,三个参数分别是,用户信息对象,加密秘钥,配置对象(expiresIn代表token有效期)
res.send({
'status': 1,
msg: "登录成功",
token:jwt.sign(user,secretKey,{expiresIn:'30s'})
})
})
// 1,使用app.use()注册
// 2,expressjwt({secret:secretKey})就是用来解析的中间件
// 3,.unless({path:[/^\/api\//]})用来指定哪些接口不需要访问权限
//4,algorithms:['HS256']必写
// 配置过 express-jwt 可通过 req.auth 获取token信息
app.use(expressjwt({ secret: secretKey, algorithms: ["HS256"] }).unless({ path: [/^\/api\//]}))
app.post('/getuser', (req, res) => {
console.log(req.user)
res.send({
status: 1,
msg: "成功",
data:req.auth
})
})
//错误中间件
app.use((err, req, res, next) => {
console.log(err)
if (err.name === 'UnauthorizedError') {
return res.send({
status: 401,
message: "无效token"
})
}
res.send({
status: 500,
message: "未知错误"
})
})