JSON Web Token (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间将信息传输为 JSON 对象。JWT 通常用于身份验证和授权目的,因为它可以使用 JSON 对象在各方之间安全地传输。在本文中,我们将探讨 JWT 的一些关键概念,包括声明、主题、颁发者、元数据、加密密钥和 URN。
声明:
声明是一组在 JWT 中编码的键值对。声明包含有关令牌主题的信息,例如他们的姓名、电子邮件或任何其他被认为必要的信息。JWT 中有三种类型的声明:注册声明、公共声明和私有声明。已注册声明是预定义的并具有特定含义,例如“iss”(发行者)声明或“sub”(主体)声明。公共声明是用于保存有关主题的附加信息的自定义声明。私有声明用于在已同意声明含义的各方之间共享信息。
主题:
主题(或“子”)声明标识作为令牌主题的委托人。这可以是用户、应用程序或作为令牌焦点的任何其他实体。主题声明是已注册的声明,用于标识令牌的接收者。
发行人:
发行人(或“iss”)声明标识发行 JWT 的实体。此声明用于指示令牌的来源并验证发行者是否可信。发行者声明是已注册的声明,用于确定令牌的可信度。
元数据:
元数据是提供有关令牌的附加上下文的信息。这可以包括有关受众的信息、到期时间以及保护令牌所需的任何其他信息。元数据被编码为 JWT 中的附加声明。
加密密钥:
可以使用密钥对 JWT 进行加密,以保护令牌中包含的信息。这是使用对称加密算法(例如 AES)完成的,加密的 JWT 称为 JWE(JSON Web 加密)。加密密钥用于对JWT进行加解密,必须保密,以保证信息的安全。
URN:
通用资源名称 (URN) 是一个字符串,用于以独立于资源位置的方式标识资源,例如 JWT 声明。JWT 中使用 URN 来识别特定声明并确保它们得到正确处理。
总之,JWT 是一种以 JSON 对象的形式在各方之间传输信息的紧凑且独立的方式。JWT 的关键概念,包括声明、主题、颁发者、元数据、加密密钥和 URN,对于理解 JWT 的工作原理以及如何将其用于身份验证和授权目的至关重要。通过理解这些概念,您可以使用 JWT 构建安全可靠的系统,在各方之间安全地传输信息。
以下是如何使用 Node.js 和 jsonwebtoken 创建 JWT 服务器的示例:
安装所需的包
首先,我们需要通过运行以下命令来安装 jsonwebtoken 包:
npm install jsonwebtoken 复制代码
导入 jsonwebtoken 包
接下来,我们将在 Node.js 文件中导入 jsonwebtoken 包:
const jwt = require('jsonwebtoken'); 复制代码
定义密钥
密钥用于签署和验证 JWT。它应该保持私密和安全。出于本示例的目的,我们将在 Node.js 文件中将密钥定义为常量:
const secret = 'secretkey'; 复制代码
创建一个函数来生成 JWT
我们将创建一个函数,它接收一个有效载荷(要在 JWT 中编码的信息)并返回一个签名的 JWT。jsonwebtoken 包为此提供了一个签名方法:
function generateJWT(payload) { return jwt.sign(payload, secret, { expiresIn: '1h' }); } 复制代码
在此示例中,JWT 将在 1 小时后过期。
创建端点以生成 JWT
接下来,我们将创建一个客户端可用于请求 JWT 的端点。我们将使用 express 库来创建端点:
const express = require('express'); const app = express(); app.post('/generateJWT', (req, res) => { const payload = req.body; const token = generateJWT(payload); res.json({ token }); }); 复制代码
启动服务器
最后,我们将使用 express 库提供的 listen 方法启动服务器:
const port = 3000; app.listen(port, () => { console.log(`JWT server running on port ${port}`); }); 复制代码
就是这样!JWT 服务器现在已启动并正在运行。客户端可以使用对 /generateJWT 端点的 POST 请求来接收签名的 JWT。
请务必注意,这只是如何构建 JWT 服务器的一个示例。在真实场景中,您需要实施额外的安全措施,例如速率限制和输入验证。jsonwebtoken 包还提供了验证 JWT 的方法,可用于验证服务器上传入的 JWT。