返回

前后端身份认证的原理与实践

前端

Node.js 基础(5)- 前后端身份认证(下)

前言

在上一节中,我们深入探讨了前后端身份认证的基础知识,包括会话管理和 JWT(JSON Web 令牌)。为了巩固我们的理解,让我们深入研究其原理并通过代码示例进行实践。

会话管理

会话管理是一种在用户会话期间跟踪用户身份的方法。当用户登录时,服务器会在客户端(通常是浏览器)上存储一个会话 ID,该 ID 用作识别用户的令牌。

原理

会话管理依靠两种关键组件:

  • 会话存储: 一个存储会话数据的数据库或缓存,例如 Redis 或 MongoDB。
  • 会话 ID: 一个唯一标识符,用于将用户请求与存储的会话数据关联起来。

代码示例

Node.js 代码(使用 Express 和 Express-session):

const express = require('express');
const session = require('express-session');

const app = express();

// 配置会话存储
const sessionStore = new RedisStore({
  host: 'localhost',
  port: 6379,
});

// 设置会话中间件
app.use(session({
  store: sessionStore,
  secret: 'mySecret', // 用来加密会话数据的密钥
  resave: false, // 不强制保存未修改的会话
  saveUninitialized: true, // 保存新的会话,即使它们未初始化
}));

// 设置会话路由
app.get('/login', (req, res) => {
  req.session.user = { username: 'test' }; // 设置会话数据
  res.send('Logged in!');
});

app.get('/protected', (req, res) => {
  if (req.session.user) { // 检查用户是否已登录
    res.send('Welcome, ' + req.session.user.username);
  } else {
    res.redirect('/login'); // 未登录则重定向到登录页面
  }
});

JWT(JSON Web 令牌)

JWT 是一种紧凑、自包含的令牌,用于在双方之间安全地传输声明(用户信息)。JWT 通常在前后端通信中用于身份验证和授权。

原理

JWT 由三个部分组成,用点号(.`)分隔:

  • 标头: 包含 JWT 的元数据,例如算法和令牌类型。
  • 有效载荷: 包含有关用户的信息,例如用户名和角色。
  • 签名: 用私钥对标头和有效载荷进行加密,以确保完整性和真实性。

代码示例

Node.js 代码(使用jsonwebtoken):

const jwt = require('jsonwebtoken');

// 生成 JWT
const token = jwt.sign({ username: 'test' }, 'myPrivateKey');

// 验证 JWT
jwt.verify(token, 'myPrivateKey', (err, decoded) => {
  if (err) { // 验证失败
    console.error('Invalid JWT');
  } else { // 验证成功
    console.log('Decoded JWT:', decoded);
  }
});

总结

会话管理和 JWT 都是重要的身份认证机制,为前后端应用程序提供安全和便捷的解决方案。通过了解它们的原理并通过代码示例进行实践,您可以有效地实现用户身份验证和授权。