什么是 RESTful API
RESTful API 是一种基于 HTTP 协议的 API 设计风格,它将资源的状态和操作以 URL 和 HTTP 方法的形式暴露给客户端,使得客户端可以通过 HTTP 请求来操作这些资源。RESTful API 的设计风格简单、灵活、可扩展,因此被广泛应用于 Web 应用程序、移动应用程序等领域。
什么是 JSON Web Token
JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑、自包含的方式,用于在各个系统之间安全地传输信息。JWT 由三部分组成:头部、载荷和签名。头部包含了 JWT 的类型和使用的加密算法,载荷包含了 JWT 的信息,签名用于验证 JWT 的合法性。
为什么要使用 JWT 实现安全认证与授权
在使用 RESTful API 进行客户端和服务器之间的通信时,需要进行安全认证和授权。传统的安全认证方式包括基于会话的认证和基于令牌的认证。基于会话的认证需要在服务器端保存会话状态,而基于令牌的认证则可以避免服务器端保存会话状态,提高了系统的可扩展性和灵活性。JWT 是一种基于令牌的认证方式,使用 JWT 可以实现无状态的认证和授权,同时也可以避免 CSRF 攻击和 XSS 攻击等安全问题。
如何使用 JWT 实现安全认证与授权
1. 生成 JWT
在服务器端生成 JWT 的过程如下:
const jwt = require('jsonwebtoken'); const secretKey = 'secret'; // 密钥 const payload = { userId: '123456', username: 'john' }; // 载荷 const options = { expiresIn: '1h' // 过期时间 }; // 选项 const token = jwt.sign(payload, secretKey, options); // 生成 JWT
2. 验证 JWT
在客户端验证 JWT 的过程如下:
const jwt = require('jsonwebtoken'); const secretKey = 'secret'; // 密钥 const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0NTYiLCJ1c2VybmFtZSI6ImpvaG4iLCJleHAiOjE2MjIwMzYwNjAsImlhdCI6MTYyMjAzMzQ2MH0.l0JY1jK8z2ZaQlZ0RvK0L7hKj3yLq0X9zRnZjQ2ZbFk'; // JWT jwt.verify(token, secretKey, (err, decoded) => { // 验证 JWT if (err) { console.error(err); } else { console.log(decoded); } });
3. 在 RESTful API 中使用 JWT
在 RESTful API 中使用 JWT 的过程如下:
const express = require('express'); const jwt = require('jsonwebtoken'); const secretKey = 'secret'; // 密钥 const app = express(); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.post('/login', (req, res) => { const { username, password } = req.body; // 验证用户名和密码 if (username === 'john' && password === '123456') { const payload = { userId: '123456', username: 'john' }; // 载荷 const options = { expiresIn: '1h' // 过期时间 }; // 选项 const token = jwt.sign(payload, secretKey, options); // 生成 JWT res.json({ success: true, token }); } else { res.json({ success: false, message: 'Invalid username or password' }); } }); app.get('/profile', (req, res) => { const token = req.headers.authorization.split(' ')[1]; // 获取 JWT jwt.verify(token, secretKey, (err, decoded) => { // 验证 JWT if (err) { res.json({ success: false, message: 'Invalid token' }); } else { res.json({ success: true, userId: decoded.userId, username: decoded.username }); } }); }); app.listen(3000, () => { console.log('Server is running on port 3000'); });
在上述示例代码中,/login
路由用于验证用户名和密码,并生成 JWT;/profile
路由用于验证 JWT,并返回用户信息。客户端在访问 /profile
路由时,需要在请求头中添加 Authorization
字段,其值为 Bearer <JWT>
,其中 <JWT>
是由服务器端生成的 JWT。
总结
使用 JWT 实现安全认证与授权具有无状态、可扩展、灵活等优点,能够提高系统的可维护性和安全性。在实际开发中,需要注意密钥的安全性、过期时间的设置、JWT 的传输方式等问题。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65c49f6eadd4f0e0fff2d351