在 RESTful API 开发中,身份验证是一个非常关键的部分。传统的身份验证方法,如使用用户名和密码,会暴露用户敏感信息的风险。JSON Web Token(JWT)是一种新的身份验证方法,可以解决这个问题,同时还能提高 API 安全性和性能。
什么是 JSON Web Token?
JSON Web Token(JWT)是一种轻量级的安全性传输协议,用于在客户端和服务器端之间传递信息。JWT 是由三个部分组成的字符串,分别是 Header、Payload 和 Signature。
Header
Header 包含 JWT 使用的签名算法,如 HMAC SHA256 或 RSA。Header 通常采用以下格式:
{ "alg": "HS256", "typ": "JWT" }
Payload
Payload 包含有关身份验证的信息,如用户 ID、姓名和角色。Payload 也可以包含其他有用的信息,如到期时间和请求权限等。Payload 通常采用以下格式:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
Signature
Signature 是将 Header 和 Payload 连接在一起,使用所选算法签名得到的字符串。Signature 用于验证 JWT 的有效性。Signature 通常采用以下格式:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
如何使用 JWT?
生成 JWT
在客户端进行身份验证时,我们需要生成 JWT 并将其发送到服务器。生成 JWT 要涉及到以下步骤:
- 创建 Header 和 Payload。
- 使用 Header 和 Payload,加上一个密钥,生成 Signature。
- 将 Header、Payload 和 Signature 串联在一起,形成 JWT。
在 JavaScript 中,可以使用 jsonwebtoken 库生成 JWT。示例代码如下:
// javascriptcn.com 代码示例 const jwt = require('jsonwebtoken'); // 创建 Header 和 Payload const header = { alg: 'HS256', typ: 'JWT' }; const payload = { sub: '1234567890', name: 'John Doe', iat: 1516239022 }; // 加上密钥生成 Signature const secret = 'my-secret'; const signature = jwt.sign({ header, payload }, secret, { algorithm: 'HS256' }); console.log(signature);
这将输出以下字符串:
eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE1MTYyMzkwMjJ9.O8scwwiYK25XGnNggUPQFHz8ph-OZM5K5d5GE5diMv0
在 RESTful API 中使用 JWT
在服务器端接收到 JWT 后,我们需要验证其有效性,并根据其中包含的信息来处理请求。验证 JWT 要涉及以下步骤:
- 从请求头中获取 JWT。
- 使用密钥验证 JWT 的 Signature。
- 检查 JWT 是否过期。
- 解码 Payload 并提取有用的信息。
- 根据提取的信息处理请求。
在 Node.js 中,可以使用 express-jwt 中间件进行 JWT 验证。示例代码如下:
// javascriptcn.com 代码示例 const express = require('express'); const jwt = require('express-jwt'); const app = express(); // 设置 JWT 验证中间件 const secret = 'my-secret'; app.use(jwt({ secret }).unless({ path: ['/login'] })); // 处理请求 app.get('/api/users', (req, res) => { const { sub, name } = req.user; // 根据用户 ID 和角色获取用户信息 const users = ...; res.json(users); }); app.post('/api/orders', (req, res) => { const { sub } = req.user; // 根据用户 ID 和请求权限创建订单 const order = ...; res.json(order); }); // 处理登录 app.post('/login', (req, res) => { const { username, password } = req.body; // 验证用户名和密码,生成并发送 JWT const user = { sub: '1234567890', name: 'John Doe' }; const token = jwt.sign({ user }, secret, { algorithm: 'HS256' }); res.json({ token }); }); app.listen(3000);
在这个示例中,我们使用 express-jwt
中间件验证 JWT,并在路由中访问 req.user
对象来访问 JWT Payload 中的信息。unless
方法允许我们排除一些路径不进行身份验证。同时,我们提供了一个登录路由,用于生成并发送 JWT。
总结
JSON Web Token(JWT)是一种新的身份验证方法,可以提高 API 安全性和性能。使用 JWT,我们可以在客户端和服务器端之间传递信息,同时还能保护用户敏感信息的安全性。希望本文对你在 RESTful API 开发中使用 JWT 有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652f9b637d4982a6eb0c7ac9