微信登录

身份验证 - Token 认证 - 使用 JWT 进行 Token 认证

身份验证 - Token 认证 - 使用 JWT 进行 Token 认证

在现代的 Web 应用开发中,身份验证是保障系统安全的重要环节。Token 认证作为一种常见的身份验证机制,因其无状态、可扩展性等优点被广泛应用。而 JSON Web Token(JWT)则是 Token 认证中非常流行的一种实现方式。本文将深入介绍 JWT 的原理,并通过实际的 Node.js 代码演示如何使用 JWT 进行 Token 认证。

什么是 JWT

JSON Web Token(JWT)是一种用于在网络应用之间安全传输信息的开放标准(RFC 7519)。JWT 由三部分组成,通过点(.)分隔:

  • Header(头部):包含令牌的类型(通常是 JWT)和使用的签名算法,如 HMAC SHA256 或 RSA。
  • Payload(负载):包含声明(Claims),声明是关于实体(通常是用户)和其他数据的声明。声明分为三种类型:注册声明、公开声明和私有声明。
  • Signature(签名):为了创建签名部分,需要使用编码后的 Header、编码后的 Payload、一个密钥(secret)和 Header 中指定的签名算法进行签名。

JWT 的结构示例:

  1. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT 的工作原理

  1. 用户登录:用户向服务器发送用户名和密码进行登录。
  2. 服务器验证:服务器验证用户的凭据,如果验证成功,服务器将创建一个 JWT 并将其返回给客户端。
  3. 客户端存储:客户端将 JWT 存储在本地(如 localStorage 或 cookie)。
  4. 后续请求:客户端在后续的请求中,将 JWT 包含在请求头中(通常是 Authorization 头)发送给服务器。
  5. 服务器验证:服务器接收到请求后,验证 JWT 的签名,如果签名有效,则认为请求是合法的,并返回相应的响应。

使用 Node.js 和 JWT 进行身份验证

安装依赖

首先,我们需要创建一个新的 Node.js 项目,并安装 jsonwebtoken 库:

  1. mkdir jwt-example
  2. cd jwt-example
  3. npm init -y
  4. npm install jsonwebtoken express

编写代码

以下是一个简单的 Node.js 示例,演示如何使用 JWT 进行身份验证:

  1. const express = require('express');
  2. const jwt = require('jsonwebtoken');
  3. const app = express();
  4. const port = 3000;
  5. // 模拟用户数据库
  6. const users = [
  7. { id: 1, username: 'admin', password: 'password' }
  8. ];
  9. // 生成 JWT
  10. const generateToken = (user) => {
  11. const payload = {
  12. id: user.id,
  13. username: user.username
  14. };
  15. const secret = 'your_secret_key';
  16. const options = {
  17. expiresIn: '1h'
  18. };
  19. return jwt.sign(payload, secret, options);
  20. };
  21. // 登录接口
  22. app.post('/login', (req, res) => {
  23. const { username, password } = req.body;
  24. const user = users.find(u => u.username === username && u.password === password);
  25. if (user) {
  26. const token = generateToken(user);
  27. res.json({ token });
  28. } else {
  29. res.status(401).json({ message: 'Invalid credentials' });
  30. }
  31. });
  32. // 验证 JWT 的中间件
  33. const authenticateToken = (req, res, next) => {
  34. const authHeader = req.headers['authorization'];
  35. const token = authHeader && authHeader.split(' ')[1];
  36. if (token == null) return res.status(401).json({ message: 'No token provided' });
  37. const secret = 'your_secret_key';
  38. jwt.verify(token, secret, (err, user) => {
  39. if (err) return res.status(403).json({ message: 'Invalid token' });
  40. req.user = user;
  41. next();
  42. });
  43. };
  44. // 受保护的接口
  45. app.get('/protected', authenticateToken, (req, res) => {
  46. res.json({ message: 'This is a protected route', user: req.user });
  47. });
  48. app.listen(port, () => {
  49. console.log(`Server is running on port ${port}`);
  50. });

代码解释

  1. 生成 JWTgenerateToken 函数接受一个用户对象作为参数,使用 jwt.sign 方法生成一个 JWT。
  2. 登录接口/login 接口接收用户的用户名和密码,验证用户的凭据,如果验证成功,则生成一个 JWT 并返回给客户端。
  3. 验证 JWT 的中间件authenticateToken 是一个中间件函数,用于验证请求头中的 JWT。如果 JWT 有效,则将用户信息添加到 req.user 中,并调用 next() 继续处理请求。
  4. 受保护的接口/protected 接口使用 authenticateToken 中间件进行身份验证,只有通过验证的用户才能访问该接口。

总结

步骤 描述
1 用户登录,服务器验证凭据并生成 JWT
2 客户端存储 JWT
3 客户端在后续请求中包含 JWT
4 服务器验证 JWT 的签名
5 如果签名有效,服务器处理请求并返回响应

通过使用 JWT 进行 Token 认证,我们可以实现无状态的身份验证,提高系统的可扩展性和安全性。在实际应用中,我们还需要注意 JWT 的过期时间、密钥的安全性等问题。

希望本文能帮助你理解 JWT 的原理和使用方法,让你在 Node.js 项目中轻松实现身份验证。