在当今互联网时代, Web 开发日益流行,越来越多的人加入了这个领域。在 Web 开发中,安全性是最重要的因素之一。为了保护用户数据和防止攻击,我们需要使用一些安全机制来保障应用程序的安全性。JSON Web Token(JWT)是一种安全的方案,它可以防止攻击者通过伪造令牌来破坏我们的应用程序。
在本篇文章中,我们将介绍如何使用 Express.js 和 JWT 构建安全 Web 应用程序。
准备工作
首先,我们需要创建一个新的 Express.js 应用程序,并将其安装到本地计算机上。以下是如何执行此操作的步骤:
- 安装 Node.js
- 在命令行中输入以下命令:
npm install -g express-generator
。 - 创建新的 Express.js 应用程序:
express --view=ejs myapp
。 - 进入应用程序目录:
cd myapp
。 - 安装依赖项:
npm install
。
我们现在准备好了,我们可以开始构建我们的应用程序了。
创建路由
首先,我们需要创建一些路由来处理用户的请求。我们将创建以下路由:
/api/login
:用于用户登录并返回 JWT 令牌。/api/protected
:用于用户访问需要身份验证的受保护资源。
在 routes
文件夹中创建一个新的文件 user.js
:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ------------------------ ----- ------ - ----------------- -- ------ ----- ----- - - ------ ------------ ------ ----------- -- --------------------- ----- ---- -- - ----- - --------- -------- - - --------- -- ------------ -- ---------- -- --------- -- --------------- --- --------- - ------ ---------------------- -------- ---------- --- - -- -- --- -- ----- ----- - --------- - -------- -- -- ---- ------------ -- -- - ---------- ---- - -- ----- -- ---------- -------- ------- ----- --- --- ------------------------ ----- ---- -- - ----- ----- - -------------------------- -- -------- -- -------- - ------ ---------------------- -------- ------- --- - --- - -- ----------- ----- - -------- - - ----------------- ------------- ---------- -------- ------------------------------- --- - ----- ------- - ------ ---------------------- -------- ---------- --- - --- -------------- - -------
分析代码:
- 我们首先导入
express
和jsonwebtoken
模块。 - 我们定义了一个
users
对象,它包含每个用户的用户名和密码。 - 我们创建了
post
路由,用于处理用户的登录请求。我们首先获取请求体中的用户名和密码,并检查它们是否与我们在users
对象中定义的用户名和密码匹配。 - 如果用户名和密码匹配,我们将生成一个 JWT 令牌并将其返回给用户。
- 我们创建了一个
get
路由,用于访问需要身份验证的受保护资源。我们首先获取请求头中的 JWT 令牌并检查其是否存在。 - 如果令牌存在,我们将验证它,并解析负载数据以提取用户名。然后,我们向用户发送一条包含欢迎信息的 JSON 响应。
- 如果令牌无效或已过期,则向用户发送一条消息,并返回 401 状态码。
我们已经创建了路由,因此现在可以开始构建我们的应用程序模型了。
构建模型
在 models
文件夹中创建一个新的文件 user.js
:
-- -------------------- ---- ------- ----- ---- - ------ -------------- - -- ----------- ----- ----- - - ------ ------------ ------ ----------- -- -- ----------------- - ------ - -------- -- - ------ ----- - - -------------- - -----
我们只创建了一个简单的 User
类,它包含一个静态 find
方法,用于查找具有给定用户名的用户。这是一个假设的实现,我们可以将其替换为使用实际数据库的查询。
集成身份验证
现在我们已经创建了路由和模型,我们需要使用身份验证中间件来保护我们的应用程序资源。
在 app.js
中增加以下中间件:
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ---- - ------------------------- -- ------- ----- ------------ - ----- ---- ----- -- - ----- ----- - -------------------------- -- -------- -- -------- - ------ ---------------------- -------- ------- --- - --- - -- ----------- ----- - -------- - - ----------------- ------------- -- -------- ----- ---- - -------------------- -- ------- - ------ ---------------------- -------- ------- --- - -- ------------- -------- - ----- ------- - ----- ------- - ------ ---------------------- -------- ---------- --- - -- -- --------------- ----- ---------- - ------------------------- ------------------------- ------------- ------------
分析代码:
- 我们首先导入
jsonwebtoken
模块和User
模型。 - 我们定义了一个
authenticate
中间件函数,它处理身份验证逻辑。与之前的路由处理函数相比,它多了一个步骤:检查用户是否存在。 - 如果找不到用户,则向用户发送一条消息,并返回 401 状态码。
- 如果用户存在,则将其添加到
req.user
对象中,并调用next()
函数。 - 我们将
authenticate
中间件添加到userRouter
上,以保护所有受/api/protected
前缀的路由。
测试应用程序
我们已经创建了应用程序,现在可以使用 Postman 等工具测试它。我们首先需要使用 /api/login
路由登录,并获取 JWT 令牌:
我们可以通过将令牌添加到请求头中,在 /api/protected
上进行访问:
如果我们在请求头中提供的令牌是无效或已过期的,则将收到以下响应:
如果我们在登录时提供了错误的用户名或密码,则将收到以下响应:
总结
我们已经介绍了如何使用 Express.js 和 JWT 构建安全的 Web 应用程序。我们创建了两个路由:一个用于用户登录,并返回 JWT 令牌;另一个用于访问需要身份验证的受保护路由。我们还创建了一个 User
模型,并使用身份验证中间件来保护我们的应用程序资源。
JWT 令牌和身份验证中间件都是 Web 开发中常使用的安全机制。它们可以防止攻击者通过伪造令牌来破坏我们的应用程序。但是,许多其他安全问题需要我们注意,如 XSS,CSRF 等。保持对我们应用程序的不断审查,将有助于保护其安全。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6461dda9968c7c53b0334143