什么是 JWT 认证?
JWT (JSON Web Token) 认证是当今最流行的 API 认证方式之一。它可以让前端开发者在无需重复登录的情况下访问应用程序的私有资源。JWT 认证通过在客户端发送的每个请求中包含一个令牌来进行安全认证。
JWT 认证的存在是为了解决传统的 cookie-based 认证方式的一些限制。传统的 cookie-based 认证会在服务器端存储会话 ID,但这会使得服务器的负载变得异常重,同时也不支持跨域请求。JWT 认证则避免了这个问题,因为它把令牌存储在客户端,并在每个请求中发送到服务器端。
Fastify 是什么?
Fastify 是一个基于 Node.js 平台的高度优化的 Web 应用程序框架,专注于提供最佳的性能和生产力。它通过集成插件(plugins)的方式实现可扩展性,为快速构建现代 Web 应用程序提供了很多方便功能。
在 Fastify 应用程序中集成 JWT 认证
安装依赖:
--- ------- ----------- ------------
在 Fastify 应用程序中启用
fastify-jwt
插件,如下所示:----- ------- - -------------------- ----- --- - ---------------------- --------------------- - ------- ------------- -- -------------------- --- -- - -- ----- ----- --- ------------------- --------- -- ---------------------------------- --
在这个示例中,我们使用
fastify-jwt
插件注册了一个名为jwt
的实例。我们还设置了一个密钥supersecret
,这将在接下来的步骤中用于签发 JWT。创建一个路由,对受保护的资源进行鉴权:
------------------------- - -------------- -------------- ----------------- -- -- ----- ------ -- - ------------ ------ ------- -- --
在这个示例中,我们定义了一个名为
/protected
的路由,使用preValidation
钩子将fastify.auth
插件和verifyJwt
一起使用。这将确保在用户登陆后,所以JWT都可以进行鉴权。如果用户未登录,则会收到401错误代码。创建一个登录路由,返回 JWT:
---------------------- ----- ------ -- - ----- ----- - ------------------ ----- ----------------- -- ------------ ----- -- --
在这个示例中,我们定义了一个名为
/login
的路由,用于创建并返回 JWT。在这个示例中,我们使用fastify.jwt.sign()
方法来签发 JWT,该方法需要包含一个可选的有效载荷/负载。在客户端发送的请求中发送 JWT:
------------------- - -------- - -------------- ------- --------- - -- -------------- -- - -- -------------- - ----- --- --------------------- --------- - ------ --------------- -- ---------- -- - ----------------- -- ------------ -- - -------------------- --
在这个示例中,我们在请求头中包含 JWT,这是通过在
Authorization
头部发送一个 Bearer (参考RFC)认证头来实现的。在服务器端,我们使用fastify-jwt
插件检查 JWT 的有效性,然后返回所需的响应。
使用 Fastify 集成 JWT 认证可以让您的应用程序更加安全,并确保只有经过身份验证的用户才能访问敏感数据。
结论
在这篇文章中,我们学习了如何使用 Fastify 应用程序集成 JWT 认证。Fastify是一个高度优化的 Web 应用程序框架,使用它可以轻松地创建现代 Web 应用并确保安全性。JWT 认证是一种流行的 API 认证方式,通过在客户端发送的请求中包含令牌来进行安全认证。当您使用 Fastify 和 JWT 认证一起使用时,可以确保您的应用程序更加安全,并确保只有经过身份验证的用户才能访问您的私有资源。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6707ec41d91dce0dc86d542e