了解 HTTP 协议的无状态性是进一步学习 Session 认证机制的必要前提。http 协议的无状态性,指的是客户端的每次 http 请求都是独立的,连续多个请求之间没有直接的关系,服务器不会主动保留每次 http 请求的状态。
什么是 Cookie
Cookie 是存储在用户浏览器中的一段不超过4 KB 的字符串。它由一个名称(Name)、一个值(Value)和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成。
不同域名下的 Cookie 各自独立,每当客户端发起请求时,会自动把当前域名下所有未过期的 Cookie 一同发送到服务器。
Cookie的几大特性:
① 自动发送
② 域名独立
③过期时限
④ 4KB 限制
Cookie 在身份认证中的作用
客户端第一次请求服务器的时候,服务器通过响应头的形式,向客户端发送一个身份认证的 Cookie,客户端会自动将 Cookie 保存在浏览器中。随后,当客户端浏览器每次请求服务器的时候,浏览器会自动将身份认证相关的 Cookie,通过请求头的形式发送给服务器,服务器即可验明客户端的身份。
Cookie 不具有安全性
由于 Cookie 是存储在浏览器中的,而且浏览器也提供了读写 Cookie 的 AP1,因此 Cookie 很容易被伪造,不具有安全性。因此不建议服务器将重要的隐私数据,通过 Cookie 的形式发送给浏览器,
注意:
千万不要使用cookie存储重要且隐私的数据,比如用户的信息和密码之类的
session工作的原理
实战
npm i express-session
express-session的相关配置
const express = require("express");
const userRouter = require("./router/user");
const bodyParser = require("body-parser");
const path = require("path");
const cors = require("cors");
const app = express();
const session = require("express-session");app.use(express.static("public"));
//ejs模版的必须配置
// app.set("view engine", "ejs");
// app.set("views", path.join(__dirname, "views"));
//解析请求体参数
app.use(bodyParser.json());
app.use(express.urlencoded({ extended: false }));//配置session中间件
app.use(session({secret: "gaofeng", //任意字符串resave: false, //固定写法saveUninitialized: true, //固定写法})
);//跨域资源共享
app.use(cors());
app.use("/api", userRouter);//错误级别的中间件
app.use((err, req, res, next) => {res.send("Error! " + err.message);
});app.listen(4444, () => {console.log("app is running on port 4444");
});
接口处理原则:
- 所有接口必须登录,除登录接口
- 验证用户名,密码是否正确
- 获取用户信息必须验证session中是否存在登录状态
- 退出即清空服务端session
const express = require("express");
const router = express.Router();
router.post("/login", (req, res) => {const { username, password } = req.body;if (username != "admin" && password != "123456") {return res.send({status: 1,msg: "登录失败",});}req.session.user = req.body; //用户信息req.session.islogin = true; //用户密码res.send({status: 0,msg: "登录成功",});
});router.get("/userInfo", (req, res) => {const { islogin } = req.session;if (!islogin) {return res.send({status: 1,msg: "获取失败,请先登录",});}res.send({status: 0,msg: "ok",data: req.session.user,});
});router.post("/logout", (req, res) => {req.session.destroy();res.send({status: 0,msg: "退出成功!!!",});
});module.exports = router;
postman进行验证
- 未登录,直接获取用户信息
- 登录成功
- 再次获取用户信息
- 退出登录
- 再次获取用户信息
这样我们就实现了基于express-session的鉴权,代码实现比较简单,主要是理清里面的逻辑原理,就知道怎么回事了!!!_