在 Web 开发中,REST API 是一种常见的服务端架构,而身份验证则是保证 API 安全性的重要措施。本文将介绍如何使用 Express.js 构建 REST API 身份验证。
什么是 REST API?
REST(Representational State Transfer)是一种基于 HTTP 协议的架构风格,用于设计 Web 应用程序的 API。REST API 的核心思想是将资源(Resource)表示成 URI(Uniform Resource Identifier),通过 HTTP 方法(GET、POST、PUT、DELETE 等)对资源进行操作。
例如,一个获取用户信息的 REST API,其 URI 可以是 /users/1
,表示获取 ID 为 1 的用户信息。使用 HTTP 方法 GET,可以请求该 URI,获取用户信息。
什么是身份验证?
身份验证(Authentication)是一种确认用户身份的过程。在 Web 应用程序中,身份验证通常是用户输入用户名和密码,服务器验证用户身份后,返回一个用于识别该用户的 Token。
Token 可以是一个字符串,包含用户信息和一些密钥,用于在用户请求 API 时进行身份验证。通过身份验证,API 可以保证只有授权的用户才能访问数据。
下面我们将使用 Express.js 构建一个简单的 REST API,并添加身份验证功能。
初始化项目
首先,我们需要初始化一个空的 Node.js 项目。可以使用 npm init
命令创建一个 package.json 文件。
安装 Express.js
接下来,我们需要安装 Express.js。可以使用 npm install express
命令安装。
创建 Express.js 应用程序
在项目根目录下,创建一个名为 app.js
的文件,输入以下代码:
const express = require('express'); const app = express(); app.listen(3000, () => { console.log('Server started on port 3000'); });
这段代码创建了一个 Express.js 应用程序,并监听 3000 端口。
添加 REST API 路由
接下来,我们需要添加 REST API 路由,用于处理 API 请求。在 app.js
文件中,输入以下代码:
app.get('/api/users/:id', (req, res) => { const id = req.params.id; const user = { id: id, name: 'John Doe' }; res.json(user); });
这段代码创建了一个 GET 请求路由,用于获取用户信息。URI 格式为 /api/users/:id
,其中 :id
表示用户 ID。在路由处理函数中,获取用户 ID,然后返回一个 JSON 格式的用户信息。
添加身份验证
接下来,我们需要添加身份验证功能。在 Express.js 中,可以使用中间件(Middleware)来实现身份验证。
首先,我们需要安装一个 JSON Web Token(JWT)库,用于生成和验证 Token。可以使用 npm install jsonwebtoken
命令安装。
然后,在 app.js
文件中,添加以下代码:
// javascriptcn.com 代码示例 const jwt = require('jsonwebtoken'); const secret = 'mysecretkey'; function authenticateToken(req, res, next) { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; if (token == null) return res.sendStatus(401); jwt.verify(token, secret, (err, user) => { if (err) return res.sendStatus(403); req.user = user; next(); }); }
这段代码定义了一个名为 authenticateToken
的中间件,用于验证身份。在中间件中,首先获取请求头中的 Authorization 字段,然后从中获取 Token。
如果 Token 不存在,返回 401 错误。如果 Token 存在,则使用 JWT 库的 verify
方法验证 Token 的有效性。如果验证失败,返回 403 错误。如果验证成功,将用户信息保存到请求对象中,然后调用 next
方法,继续处理请求。
添加受保护的 REST API 路由
最后,我们需要添加一个受保护的 REST API 路由,需要身份验证后才能访问。在 app.js
文件中,添加以下代码:
app.get('/api/protected', authenticateToken, (req, res) => { res.json(req.user); });
这段代码创建了一个 GET 请求路由,需要身份验证后才能访问。在路由处理函数中,返回当前用户的信息。
示例代码
完整的示例代码如下:
// javascriptcn.com 代码示例 const express = require('express'); const jwt = require('jsonwebtoken'); const app = express(); const secret = 'mysecretkey'; function authenticateToken(req, res, next) { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; if (token == null) return res.sendStatus(401); jwt.verify(token, secret, (err, user) => { if (err) return res.sendStatus(403); req.user = user; next(); }); } app.get('/api/users/:id', (req, res) => { const id = req.params.id; const user = { id: id, name: 'John Doe' }; res.json(user); }); app.get('/api/protected', authenticateToken, (req, res) => { res.json(req.user); }); app.listen(3000, () => { console.log('Server started on port 3000'); });
总结
本文介绍了如何使用 Express.js 构建 REST API 身份验证。通过添加身份验证中间件,可以保证 API 的安全性,只有授权的用户才能访问数据。希望本文对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65824610d2f5e1655dd6b35f