在 Web 应用中,用户认证是一个至关重要的功能。它用于确定用户的身份以及授权用户访问受保护的资源。在本文中,我们将介绍如何使用 Fastify 和 JSON Web Token 进行用户认证。
什么是 Fastify?
Fastify 是一个快速、低开销、且高效的 Web 框架,其中内置了路由、中间件、输入验证等功能。它支持异步请求处理,并且具有出色的性能表现。
什么是 JSON Web Token(JWT)?
JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它通常用于身份认证和授权。JWT 包含一些声明(键值对),这些声明用于描述身份信息和其他元数据。JWT 使用签名来验证发送方和接收方之间的完整性,并且可以加密以实现保密性。
实现用户认证
在进行用户认证之前,我们需要创建一个用户数据库。我们可以使用 MongoDB、PostgreSQL 或其他任何我们喜欢的数据库。在本文中,我们使用 MongoDB。
首先,我们需要安装所需的依赖项:
npm install fastify fastify-jwt fastify-cors fastify-mongodb
在我们的项目中,我们需要使用以下依赖项:
fastify
- 快速且高效的 Web 框架fastify-jwt
- 用于 JSON Web Tokens 的 Fastify 插件fastify-cors
- Fastify 插件,用于启用跨域资源共享(CORS)fastify-mongodb
- Fastify 插件,用于集成 MongoDB 数据库
接下来,我们需要创建 Fastify 应用程序的实例,并将所需的插件注册到应用程序中:
-- -------------------- ---- ------- ----- ------- - -------------------- ------- ---- -- ----------------------------------------- ---------------------------------------- - ------- --------------- -- --- ---- ----- - ---------- ---- -- --- ---- - -- -------------------------------------------- - ---- -------------------------------- --展开代码
在这里,我们注册了 fastify-cors
、fastify-jwt
和 fastify-mongodb
插件,并传递了所需的选项。
接下来,我们可以创建一个 users
路由用于处理用户的注册和登录:
-- -------------------- ---- ------- ------------------------- ----- --------- ------ -- - ----- - ------ -------- - - ------------ ----- ----- - ------------------------------------ ----- ---- - ----- --------------- ----- -- -- ------ - -- ---------------- ---------------------- -------- ----- ------- ------- -- ------ - -- --------------- ----- -------------- - ----- --------------------- --- ----- ------- - - ------ --------- -------------- - ----- ------ - ----- ------------------------ -- ---- ------------------------- -- ---------------------- ----- --------- ------ -- - ----- - ------ -------- - - ------------ ----- ----- - ------------------------------------ -- ---- ----- ---- - ----- --------------- ----- -- -- ------- - -- --------------- ---------------------- -------- -------- ----- -- --------- -- ------ - -- ---- ----- ------- - ----- ------------------------ -------------- -- ---------- - -- -------------- ---------------------- -------- -------- ----- -- --------- -- ------ - -- ------------ --- --------- ----- ----- - ------------------ ----- -- ------------ ----- -- --展开代码
上述代码中,我们使用 /register
路由注册新用户,并将其存储在 users
集合中。在 /login
路由中,我们首先在 users
集合中查找用户。如果用户不存在或密码不正确,则发送错误响应。否则,我们生成一个 JWT,并将其发送给客户端。
验证 JWT
一旦用户成功登录并收到 JWT,我们需要在后续请求中验证 JWT。为此,我们可以编写一个 Fastify 中间件,用于验证 JWT:
-- -------------------- ---- ------- -------------------------------- ----- --------- ------ -- - --- - ----- ------------------- - ----- ----- - --------------- - -- ----------------------------- -------------------------------------展开代码
在这里,我们向 Fastify 应用程序添加了一个名为 authenticate
的装饰器。该装饰器检查请求头中是否存在有效的 JWT。如果 JWT 无效,则向客户端发送错误响应。
接下来,我们在 Fastify 应用程序的钩子函数中添加了 preHandler
钩子。此钩子用于验证 JWT,以确保其所有保护的路由都受到保护。
保护路由
现在,我们已经完成了用户认证的实现,现在我们需要将我们的路由保护起来,以确保只有经过身份验证的用户才能访问受保护的资源。为此,我们需要使用 fastify.decorate
来向 Fastify 应用程序添加受保护的路由:
-- -------------------- ---- ------- --------------------------- --------- ------ -- - ------ ------------ -- -------------------- -- --------------- ------- ------ ---- ------------- ----------- ------------------------------------- -------- --------- ------ -- - -- ---------- -- -------------------------- ------- - ---------------------- -------- ----------- -- ------ - -- ---- ------------ -------- ------ ------ -- - --展开代码
在上面的代码中,我们使用 fastify.decorate
添加了 isAdmin
功能。此功能指示是否有权访问受保护的路由。然后,我们通过 fastify.route
向 Fastify 应用程序添加了 /protected
路由,并使用 fastify.authenticate
中间件保护了该路由。在处理该路由时,我们检查当前用户是否拥有管理员权限。如果不是,则向客户端发送错误响应;否则,我们继续处理请求并向客户端发送响应。
示例代码
下面是一个使用 Fastify 和 JSON Web Token 进行用户认证的完整示例代码:
-- -------------------- ---- ------- ----- ------- - -------------------- ------- ---- -- ----- ------ - ----------------- ----------------------------------------- ---------------------------------------- - ------- --------------- ----- - ---------- ---- - -- -------------------------------------------- - ---- -------------------------------- -- -------------------------------- ----- --------- ------ -- - --- - ----- ------------------- - ----- ----- - --------------- - -- ----------------------------- ------------------------------------- --------------------------- --------- ------ -- - ------ ------------ -- -------------------- -- ------------------------- ----- --------- ------ -- - ----- - ------ -------- - - ------------ ----- ----- - ------------------------------------ ----- ---- - ----- --------------- ----- -- -- ------ - ---------------------- -------- ----- ------- ------- -- ------ - ----- -------------- - ----- --------------------- --- ----- ------- - - ------ --------- -------------- - ----- ------ - ----- ------------------------ ------------------------- -- ---------------------- ----- --------- ------ -- - ----- - ------ -------- - - ------------ ----- ----- - ------------------------------------ ----- ---- - ----- --------------- ----- -- -- ------- - ---------------------- -------- -------- ----- -- --------- -- ------ - ----- ------- - ----- ------------------------ -------------- -- ---------- - ---------------------- -------- -------- ----- -- --------- -- ------ - ----- ----- - ------------------ ----- -- ------------ ----- -- -- --------------- ------- ------ ---- ------------- ----------- ------------------------------------- -------- --------- ------ -- - -- -------------------------- ------- - ---------------------- -------- ----------- -- ------ - ------------ -------- ------ ------ -- - -- -------------------- ----- -- - -- ----- - ---------------------- --------------- - ------------------------ --------- -- ---------------------------------- --展开代码
总结
通过使用 Fastify 和 JSON Web Token,我们可以轻松地实现用户认证。在本文中,我们创建了一个 Fastify 应用程序,并向其添加了插件和中间件以处理用户注册、登录和 JWT 验证。我们还保护了受保护的路由,并检查当前用户是否为管理员。同时,我们还提供了一个完整的示例代码,帮助您更轻松地理解如何使用 Fastify 和 JSON Web Token 进行用户认证。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6499944248841e9894697b49