13.Session 认证机制

 

1.不同开发模式下的身份认证

对于服务端渲染和前后端分离这两种开发模式来说,分别有着不同的身份认证方案:

  • 服务端渲染推荐使用 Session 认证机制
  • 前后端分离推荐使用 JWT 认证机制

Cookie 是存储在用户浏览器中的一段不超过 4 KB 的字符串。它由一个名称(Name)、一个值(Value)和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成。

不同域名下的 Cookie 各自独立,每当客户端发起请求时,会自动把当前域名下所有未过期的 Cookie 一同发送到服务器。

Cookie的几大特性:

  • 自动发送
  • 域名独立
  • 过期时限
  • 4KB 限制

客户端第一次请求服务器的时候,服务器通过响应头的形式,向客户端发送一个身份认证的 Cookie,客户端会自动将 Cookie 保存在浏览器中。

随后,当客户端浏览器每次请求服务器的时候,浏览器会自动将身份认证相关的 Cookie,通过请求头的形式发送给服务器,服务器即可验明客户端的身份。

由于 Cookie 是存储在浏览器中的,而且浏览器也提供了读写 Cookie 的 API,因此 Cookie 很容易被伪造,不具有安全性。因此不建议服务器将重要的隐私数据,通过 Cookie 的形式发送给浏览器。

注意:千万不要使用 Cookie 存储重要且隐私的数据,比如用户的身份信息、密码等

在浏览器查看Cookies:

  • 浏览器控制台 -> Application -> Storage -> Cookies

  • 浏览器控制台 -> Network -> 请求 -> Request Headers -> Cookie

4.Session 认证机制

Session 的工作原理:

5.在 Express 中使用 Session 认证

1.安装 express-session 中间件

在 Express 项目中,只需要安装 express-session 中间件,即可在项目中使用 Session 认证

1
npm install express-session

2.配置 express-session 中间件

express-session 中间件安装成功后,需要通过 app.use() 来注册和配置 session 中间件

1
2
3
4
5
6
7
8
9
10
// 导入 session 中间件
const session = require('express-session');
// 注册和配置 session 中间件
app.use(
session({
secret: 'itheima',
resave: false,
saveUninitialized: true,
})
);

3.向 session 中存数据

当 express-session 中间件配置成功后,即可通过 req.session 来访问和使用 session 对象,从而存储用户的关键信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 登录的 API 接口
app.post('/api/login', (req, res) => {
// 判断用户提交的登录信息是否正确
if (req.body.username !== 'admin' || req.body.password !== '000000') {
return res.send({ status: 1, msg: '登录失败' })
}

// 将登录成功后的用户信息,保存到 Session 中
// 注意:只有成功配置了 express-session 这个中间件之后,才能够通过 req 点出来 session 这个属性
req.session.user = req.body // 用户的信息
req.session.islogin = true // 用户的登录状态

res.send({ status: 0, msg: '登录成功' })
})

4.从 session 中取数据

可以直接从 req.session 对象上获取之前存储的数据

1
2
3
4
5
6
7
8
9
10
11
12
// 获取用户姓名的接口
app.get('/api/username', (req, res) => {
// 从 Session 中获取用户的名称,响应给客户端
if (!req.session.islogin) {
return res.send({ status: 1, msg: 'fail' })
}
res.send({
status: 0,
msg: 'success',
username: req.session.user.username,
})
})

5.清空 session

调用 req.session.destroy() 函数,即可清空服务器保存的 session 信息。

1
2
3
4
5
6
7
8
9
// 退出登录的接口
app.post('/api/logout', (req, res) => {
// TODO_04:清空 Session 信息
req.session.destroy()
res.send({
status: 0,
msg: '退出登录成功',
});
});

6.了解 Session 认证的局限性

Session 认证机制需要配合 Cookie 才能实现。由于 Cookie 默认不支持跨域访问,所以,当涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实现跨域 Session 认证。

注意:

  • 当前端请求后端接口不存在跨域问题的时候,推荐使用 Session 身份认证机制。
  • 当前端需要跨域请求后端接口的时候,不推荐使用 Session 身份认证机制,推荐使用 JWT 认证机制。