在现代 web 应用程序中,身份验证和授权是两个非常重要的方面。JSON Web Tokens(JWT)为这些功能提供了一种标准的方法。在 Node.js 中实现 JWT 身份验证和授权,我们通常会使用 jsonwebtoken 库来生成和验证 JWT。本文将介绍如何在 Node.js 应用程序中实施 JWT 身份验证和授权,并提供相应的代码示例。

什么是 JWT?

JWT 是一种开放标准(RFC 7519),它定义了一种简洁的、自包含的方法,用于在各方之间安全地传输信息。JWT 由三部分组成: 1. Header(头部) 2. Payload(有效载荷) 3. Signature(签名)

这三部分通过句点(.)连接在一起,形成一个字符串。例如:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

安装依赖

在开始编写代码之前,确保你已经安装了 Node.js 和 npm。然后创建一个新的项目,并安装必要的依赖:

mkdir jwt-auth-example
cd jwt-auth-example
npm init -y
npm install express jsonwebtoken body-parser

创建服务器

以下是一个简单的 Express 服务器示例,它实现了 JWT 身份验证和授权。

const express = require('express');
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json());

const PORT = 3000;
const SECRET_KEY = 'your_secret_key';  // 替换成你的密钥

// 用户数据示例
const users = [
    { id: 1, username: 'user1', password: 'password1' },
    { id: 2, username: 'user2', password: 'password2' }
];

// 登录路由
app.post('/login', (req, res) => {
    const { username, password } = req.body;

    const user = users.find(u => u.username === username && u.password === password);
    if (!user) {
        return res.status(401).send('用户名或密码错误');
    }

    // 用户身份验证通过,生成 JWT
    const token = jwt.sign({ id: user.id, username: user.username }, SECRET_KEY, { expiresIn: '1h' });
    return res.json({ token });
});

// 中间件:验证 JWT
function authenticateToken(req, res, next) {
    const token = req.headers['authorization'] && req.headers['authorization'].split(' ')[1];
    if (!token) return res.sendStatus(401);

    jwt.verify(token, SECRET_KEY, (err, user) => {
        if (err) return res.sendStatus(403);
        req.user = user;
        next();
    });
}

// 受保护的路由
app.get('/protected', authenticateToken, (req, res) => {
    res.json({ message: '这是一个受保护的路由', user: req.user });
});

// 启动服务器
app.listen(PORT, () => {
    console.log(`服务器运行在 http://localhost:${PORT}`);
});

代码解析

  • 登录接口:用户通过 POST 请求 /login 提交用户名和密码。服务器会校验这些信息,如果成功登录,则生成 JWT 并返回给客户端。
  • JWT 验证中间件authenticateToken 函数是一个中间件,用于验证传入请求中的 JWT。它会检查请求头中的 Authorization 字段,并验证 token 的有效性。
  • 受保护的路由:通过 authenticateToken 中间件保护的 /protected 路由,只有通过验证的用户才能访问。

测试接口

  1. 使用 Postman 或者其他工具发送 POST 请求到 /login,提供用户名和密码。
  2. 将返回的 token 存储起来。
  3. 发送 GET 请求到 /protected,在请求头中添加 Authorization: Bearer your_token

总结

在这篇文章中,我们实现了一个简单的 JWT 身份验证和授权系统。JWT 为我们提供了一种轻量级的方式来保护 API,确保只有经过身份验证的用户才能访问受保护的资源。在真实的应用中,记得使用 HTTPS、加密存储密码等最佳实践,以提高安全性。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部