什么是JWT(Json Web Token)

JWT,全称为 JSON Web Token,是一种开放标准(RFC 7519),用于在网络应用环境间安全地传递信息。JWT 的密钥基于 JSON 格式,因此它易于使用和理解。它主要用于身份验证和信息交换。

JWT 通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。这三部分通过点(.)分隔开。

  1. 头部(Header):通常由两部分组成:令牌的类型(JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。 json { "alg": "HS256", "typ": "JWT" }

  2. 载荷(Payload):包含你想传递的数据。JWT 的载荷部分可以包含任何信息,但通常具有一些注册声明(如 subissexp 等)和自定义声明。 json { "sub": "1234567890", "name": "John Doe", "admin": true }

  3. 签名(Signature):为了防止数据被篡改,JWT 会使用头部中的算法和秘钥对头部和载荷进行签名。 HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

JWT的用途

  1. 身份验证:JWT 最常见的用途是身份验证。一旦用户通过登录验证,他们将获得一个 JWT,之后每次请求都会携带该令牌,从而允许用户访问受保护的路由。

  2. 信息交换:由于 JWT 可以被签名(例如使用公钥/私钥),因此可以验证信息的发送者以及完整性。这对于传输敏感信息非常有用。

  3. 跨域认证:在现代的前后端分离的架构中,JWT 允许客户端和服务器之间安全地传递身份信息。

JWT的优势

  1. 自包含:JWT 令牌中包含了所有用户信息,这意味着不需要在服务器上存储会话信息。

  2. 跨平台:由于 JWT 是基于 JSON 的,所以它可以在 Web、移动设备等多种平台间无缝使用。

  3. 加密安全性:JWT 可以通过加密算法进行签名和验证,保证信息的安全性。

实战:如何使用JWT

这里我们用 Node.js 和 Express 构建一个简单的示例,展示如何生成和验证 JWT。

安装依赖

首先,确保你的环境中安装了 Node.js。创建一个新的项目并安装 expressjsonwebtoken

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

创建服务器

接下来,创建一个 server.js 文件,编写以下代码:

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

const app = express();
const PORT = 3000;
const SECRET_KEY = 'your-256-bit-secret';

app.use(bodyParser.json());

// 登录路由
app.post('/login', (req, res) => {
    // 假设一个简单的用户验证
    const user = { id: 1, username: 'user', password: 'password' }; // 预设用户数据

    const { username, password } = req.body;
    if (username === user.username && password === user.password) {
        // 用户验证成功,生成 JWT
        const token = jwt.sign({ id: user.id }, SECRET_KEY, { expiresIn: '1h' });
        return res.json({ token });
    }
    res.status(403).send('用户名或密码错误');
});

// 受保护路由
app.get('/protected', (req, res) => {
    const token = req.headers['authorization']?.split(' ')[1];

    if (!token) {
        return res.sendStatus(401);
    }

    jwt.verify(token, SECRET_KEY, (err, user) => {
        if (err) {
            return res.sendStatus(403);
        }
        res.json({ message: '欢迎访问受保护的路由', user });
    });
});

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

运行服务器

在终端中运行以下命令启动服务器:

node server.js

测试接口

  1. 登录:使用 Postman 或 curl 进行请求 ``` POST http://localhost:3000/login Content-Type: application/json

{ "username": "user", "password": "password" } ``` 成功后将返回一个 JWT。

  1. 访问受保护的路由: GET http://localhost:3000/protected Authorization: Bearer <token> 替换 <token> 为你从登录接口获得的 JWT。

总结

JWT 是一种轻量级、跨平台的身份验证和信息交换机制,借助于它,你可以高效地管理用户身份和权限。通过这篇文章,你应该了解了 JWT 的基本概念、用途、优势以及如何在 Node.js 中实现 JWT。希望你能在项目中灵活应用 JWT!

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部