随着现代 web 应用程序的发展,前端开发人员逐渐将业务逻辑移向了客户端,前后端分离的趋势逐渐明显。在客户端处理这些逻辑涉及到许多安全问题,其中之一就是验证授权。而 JSON Web Token(JWT)则成为了一个流行的解决方案。
JWT 是一种轻量级的安全令牌,使用 JSON 作为负载传输信息,并可以被加密。在 JWT 中,令牌由三部分组成:头部,载荷(payload)和签名。
Fastify 是一个快速、高效和低开销的 Node.js Web 服务器框架。本文将介绍如何在 Fastify 中实现 JWT 的解码和签发。
安装 Fastify 和 JWT 包
在继续本文前,请确保您已经安装了 Node.js 和 npm。
安装 Fastify 包:
--- ------- ------- ------
安装 JWT 包:
--- ------- ------------ ------
JWT 生成和解析
首先,我们需要定义一个 JSON Web Token 生成函数,创建一个有输入值(用户名)的 JWT。
----- --- - ----------------------- -------- ----------------------- - ----- ------- - - -------- - ----- ------ - ------------ ----- ------- - - ---------- ---- - ------ ----------------- ------- -------- -
在上述代码中,JWT 包中的 sign
函数生成一个新的 JWT。它需要三个参数:
payload
- 包含有用信息的对象,将作为 JWT 的第二部分载荷(payload)。在本例中,负载只包含一个用户名字段。secret
- 加密 JWT 的密钥,用于生成加密的签名。options
- 可选的选项对象,它可以包含 expiresIn 字段,指定 JWT 的过期时间。
示例中的 generateToken
函数返回生成的 JWT。我们可以将此函数用于登录成功时的逻辑,以生成代表已通过验证的用户的 JWT。
接下来,我们需要实现一个函数来验证传入的 JWT。以下是示例代码:
-------- ------------------ - ----- ------ - ------------ --- - ----- ------- - ----------------- ------- ------ ---------------- - ----- ------- - ------------------ ------ ---- - -
该函数将传入的 JWT 进行解码,然后返回负载(payload)中的用户名。如果传入的 JWT 无效,则会抛出错误,此时将返回 null。
在实际应用中,我们可以将此函数用于用户路由中,以验证特定请求是否来自已授权的用户。
在 Fastify 中使用 JWT
首先,我们需要在 Fastify 中定义一个中间件,验证每个请求是否有有效的 JWT。以下是示例代码:
----- -------- ------------------------------ ------ - ----- ------------------- - ----------------------------- -- ---------------------- - ----- --- --------------------- - ----- ----- - ----------------------------------- -- --- ----- -------- - ------------------ -- ----------- - ----- --- --------------------- - ------------ - - -------- - -
在该函数中,我们首先从请求标头中提取 JWT,然后使用上述 verifyToken
函数对其进行验证。如果 JWT 未通过验证,则返回 401 错误代码。如果 JWT 通过了验证,我们将用户名附加到请求中,以便稍后进行检查。
接下来,我们可以在 Fastify 注册路由时使用此中间件。以下是示例代码:
----- --- - --------- ------------------- - ----------- --------------------- -- --------- ------ -- - ----- - -------- - - ------------ -------------------- -------------- -- ---------------- -- -- - ------------------- --------- -- ---- ------ --
在上述代码中,我们为 Fastify 应用程序定义了一个 /private
路由。我们还使用 preHandler
选项指定了中间件函数,在请求路由启动之前执行验证。
结论
在本文中,我们已经了解了如何在 Fastify 中使用 JSON Web Tokens 进行身份验证。我们已经定义了一个函数来生成 JWT 并使用相同的密钥进行签名。我们还编写了用于验证 JWT 的函数,并实现了一个 Fastify 中间件来确保请求是否是由已经过身份验证的用户发送的。
希望这篇文章可以帮助您理解如何使用 Fastify 和 JWT 创建安全的 web 应用程序。如果您对代码感到好奇,可以访问 Fastify 及 JWT 的文档来获取更多信息,以及在 GitHub 或其他代码托管服务中查看示例代码。
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/66f65567c5c563ced582fc78