介绍
在现代应用程序中,安全是至关重要的。由于互联网时代大量用户账号的出现,为用户操作带来了风险。因此,身份验证是应用程序的核心部分之一。在本文中,我们将深入探讨如何使用 Hapi.js 和 JWT 创建身份验证微服务。
Hapi.js
Hapi.js 是一个流行的 Node.js Web 框架,它提供了一组工具和插件,来构建可扩展的 Web 应用程序。与其他 Web 框架不同,Hapi.js 的焦点并不仅在于 HTTP 路由,它更强调开发者友好性和可测试性。
JWT
JSON Web Token(JWT)是一种开放标准,它定义了一种紧凑、自包含的格式,用于在双方之间安全地传输信息。它通常用于身份验证和授权,因为它可以帮助我们识别请求的来源并对其进行授权。
如何使用 Hapi.js 和 JWT 来创建身份验证微服务
在本文中,我们将学习如何使用 Hapi.js 和 JWT 来创建身份验证微服务。此服务将由以下主要组件组成:
- 数据库:此服务将使用 MongoDB 数据库。
- Hapi.js:我们将使用此框架来构建此服务。
- JWT:我们将使用此标准来创建和验证用户令牌。
以下是实现此服务的步骤:
安装和配置 Hapi.js
首先,我们需要安装 Hapi.js 及其相关插件:
npm install @hapi/hapi @hapi/joi @hapi/bell @hapi/boom @hapi/hapi-auth-jwt2
然后,我们需要创建一个新项目并安装所需插件:
mkdir my-auth-service && cd my-auth-service npm init -y npm install @hapi/hapi @hapi/joi @hapi/bell @hapi/boom @hapi/hapi-auth-jwt2 touch index.js
接下来,我们创建一个基本的 Hapi.js 应用程序,并在其中设置身份验证插件:
-- -------------------- ---- ------- ----- ---- - ---------------------- -- ----------------------- ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- --- -- -- -------------- ------ ----- ----------------- ------------------------------- --- --------------------------- ------ - ---- -------------- -- ------------- --- --------- ----- --------- -------- -- -- - -- -- --- ---- -- --------------- -- --- ----- -- ---------------------- ---- --- -- -------------------------- ------ --- ------ --------- ------ -- -------------- - ----------- --------- - -- -- --- ------- --- --------------------------- -- ---- -------------- - ------- ------ ----- ---- -------- --------- -- -- - ------ ------ -------- - -- - ------- ------ ----- ------------- -------- --------- -- -- - ------ ----- -- - --------- -------- -- ------- - ----- ----- -- ----------- - - --- -- ----- ----- --------------- ------------------- ------- -- ---- ----------------- -- -------------------------------- ----- -- - ----------------- ---------------- --- -------
这是一个简单的 Hapi.js 应用程序示例,其中定义了两个路由:一个公共路由和一个受保护路由。您可以通过访问 /protected
路由来验证身份验证插件是否正常工作。
添加 MongoDB 数据库支持
接下来,我们需要添加对 MongoDB 数据库的支持。为此,我们将使用 Mongoose,它是一个流行的 MongoDB ORM。首先,我们需要安装 mongoose:
npm install mongoose
然后,我们将设置和配置数据库:
-- -------------------- ---- ------- ----- -------- - -------------------- -- --- ------- --- --------------------------------------------- - ---------------- ----- ------------------- ----- --------------- ---- --- ----- -- - -------------------- -------------- --------------------------- -------- ---------- ---------- --------------- -- -- - -------------------- --------- ---------------- --- -- ------ ----- ---------- - --- ----------------- ------ - ----- ------- --------- ----- ------- ---- -- --------- - ----- ------- --------- ---- - --- ----- ---- - ---------------------- ------------
在这个例子中,我们连接到名为 myapp
的 MongoDB 数据库。然后,我们定义 Users 模型以存储用户记录。
添加注册和登录路由
在此步骤中,我们将添加用于注册和登录用户的路由。这些路由将接收来自客户端的有效负载并对其进行验证和处理。对于此示例,我们将使用 @hapi/joi
库来验证请求的有效负载。
-- -------------------- ---- ------- ----- --- - --------------------- ----- ------ - -------------------- ----- --- - ------------------------ -------------- - ------- ------- ----- ------------ -------- ----- --------- -- -- - --- - ----- ------- --------- - ---------------- -- ------ ----- ------ - ------------ ------ -------------------------------- --------- ------------------------------ --- ----- ---------------- - ----- ---------------------------- ----------- -- ------------------ ----- ---- - ----- -------------------- -------------------------------- -- ------ - ------ ---------------------- ------- ---------- - -- -- ------ ---- ----- ---- - ----- ------------------- ----- ----------------- - ----- -------------------------------------- ------ -- ------- ----- ------------------- ----------------------- --------- -------------------- ------ --------- ----- ------- ---------------- - ----- ---- - ------------------ ------ ---------------- - -- ------- - ----- ------ -- ---------- ------------ --------- ------ ------ ---------- - --- ---- ---- --- -------- ----- -------- --------- - -------- ------------ ------ -------------------------------- --------- ------------------------------ -- - - -- - ------- ------- ----- --------- -------- ----- --------- -- -- - --- - ----- ------- --------- - ---------------- -- ------ ----- ------ - ------------ ------ -------------------------------- --------- ----------------------- --- ----- ---------------- - ----- ---------------------------- ----------- -- ---- ----- ---- - ----- -------------------- -------------------------------- -- ------- - ------ -------------------------- ----- -- ------------ - -- ---- ----- ------------- - ----- ----------------------------------------- --------------- -- ---------------- - ------ -------------------------- ----- -- ------------ - -- ----- --- ----- ----------- - ---------------- ------------ --------------- ------ -------------- - ----- ---- - ------------------ ------ ---------------- - -- ------- - ----- ------ -- ---------- ------------ ------ ------ ------ ----- - ---- ---- --- ------ --- ------- -- ------ ------- ----- -------- --------- - -------- ------------ ------ -------------------------------- --------- ----------------------- -- - - - ---
在这个例子中,首先我们定义了路由 /register
和 /login
。 它们都将接收来自客户端的有效负载并对其进行验证。如果有效负载通过验证,则将保存或查找用户,并使用 bcrypt 加密和验证密码。
在 /register
路由中,我们根据输入有效负载创建新用户。同时,我们还检查是否存在具有相同电子邮件的用户。如果存在,我们将返回 Boom.badRequest
,从而表示该请求不合法。
在 /login
路由中,我们将查找用户并验证其密码。最后,我们使用 jsonwebtoken
库生成并返回 JWT。
测试服务
我们现在可以通过执行以下命令来测试这个服务:
npm start
我们可以通过访问 /register
和 /login
路由来测试服务的身份验证功能。
例如,如果我们要注册新用户,则应该发出类似以下示例有效负载的 POST 请求:
{ "email": "user@example.com", "password": "mypassword" }
如果请求有效,则应该返回以下响应:
{ "message": "User created successfully!" }
如果我们要登录,则应发出类似以下示例有效负载的 POST 请求:
{ "email": "user@example.com", "password": "mypassword" }
如果请求有效,则应该返回以下响应,其中包含我们生成的 JWT:
{ "accessToken":"<JWT token>" }
接下来,我们可以使用生成的 JWT 访问受保护的路由。例如,我们可以通过将 JWT 放在 Authorization
标头中并向 /protected
路由发送 GET 请求来测试此功能:
curl -H "Authorization: Bearer <JWT token>" http://localhost:3000/protected
如果 JWT 是有效的,则应该返回以下响应:
"This is a protected route!"
否则,将返回 401 Unauthorized
响应。
结论
在本文中,我们学习了如何使用 Hapi.js 和 JWT 创建身份验证微服务。我们学习了如何:安装和配置 Hapi.js 框架、链接 MongoDB 数据库、验证和处理有效负载、加密和验证密码,并生成 JWT 以供身份验证使用。现在,您可以使用本文的指南和示例代码来创建您自己的身份验证微服务。
参考资料
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670b3961d91dce0dc8888bf5