Hapi 是一款 Node.js 的框架,用于构建 Web 应用程序和服务。它提供了一系列很好的内置功能,其中包括身份验证。
在本文中,我们将介绍如何使用 Hapi 框架实现身份验证。我们将使用 JSON Web Token(JWT)和 Bcrypt 程序库来实现身份验证。我们将创建一个基本的身份验证模块,该模块将检查用户是否可以访问受保护的路由。这将包括不同的步骤:
- 安装 Hapi 和相关的程序库
要安装 Hapi,您可以使用 npm:npm install @hapi/hapi
我们还需要安装两个程序库:jsonwebtoken 和 bcrypt
npm install jsonwebtoken bcrypt
- 创建 JWT
JSON Web Tokens(JWT)是一种基于 JSON 的开放标准(RFC 7519),用于在双方之间安全地传输信息。我们将使用 JWT 来验证用户的身份。
首先,我们将创建一个 JWT。以下是创建 JWT 的代码:
const jwt = require('jsonwebtoken'); const createToken = (userId) => { return jwt.sign({ id: userId }, 'secret_key', { expiresIn: '24h' }); }
此代码将返回一个 JWT,其中包含用户 ID 和一些其他属性。我们还可以为 JWT 设置过期时间。
- 哈希密码
我们需要将用户的密码哈希化,以便我们可以在未保存实际密码的情况下进行安全比较。我们可以使用 bcrypt 程序库来实现这一点。以下是一个哈希化密码的代码:
const bcrypt = require('bcrypt'); const hashPassword = async (password) => { return bcrypt.hash(password, 10); }
在这里,我们使用 bcrypt 的哈希函数将密码哈希化。参数 10 表示哈希强度。
- 验证用户凭证
现在我们已经有了哈希化的密码和 JWT。接下来,我们需要编写代码,对用户的凭证进行验证。
在接下来的代码中,我们将使用 Hapi 的服务器验证策略来验证 API 端点。我们首先需要设置路由和策略:
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ---- --- ----- ------------------------------------------- --------------------------- ------ - ---- ------------- --------- ----- --------- -------- -- - ----- - -- - - -------- ----- ---- - ----- -------------- -- --- -- ------- - ------ - -------- ----- -- - ------ - -------- ---- -- - --- --------------------------- -- ---- ----- --------------- ------------------- ------- -- ---- ----------------- -- -------------------------------- ----- -- - ----------------- ---------------- --- -------
我们通过调用 server.register
来注册 hapi-auth-jwt2 插件来处理 JWT 策略的验证。接下来,我们通过调用 server.auth.strategy
和 server.auth.default
方法来定义策略。
在定义路由之前,让我们看一下验证函数本身的实现。此功能将 JWT 中的 ID 提取出来并查找用户,如果找到用户,则返回以下内容:
{ isValid: true }
如果找不到用户,则返回以下内容:
{ isValid: false }
接下来,我们将定义路由。以下是我们的示例代码:
-- -------------------- ---- ------- -------------- ------- ------ ----- ------------- -------- --------- -- -- - ------ ------------ -- -------- - ----- ----- - ---
我们将定义一个受保护的路由“/protected”。注意我们在选项中指定了要使用的验证策略 auth:'jwt'。
接下来,我们将创建一个验证函数,以便我们可以使用它来检查用户是否有权访问路由。
-- -------------------- ---- ------- ----- ------------ - ----- --------- --------- --------- -- - ----- ---- - ----- -------------- -------- --- -- ------- - ------ - ------------ ----- -------- ----- -- - ----- ------- - ----- ------------------------ --------------- -- ---------- - ------ - ------------ ----- -------- ----- -- - ----- ----------- - - --- -------- ----- ---------- ------ ---------- -- ------ - ------------ ------- -- --
这个函数将查找用户,并使用 bcrypt 程序库的 compare 函数比较哈希化的密码。如果密码匹配,则将返回用户的凭据。
最后,我们需要在身份验证模块中导出两个函数:
module.exports = { createToken, validateUser }
- 结论
在这篇文章中,我们演示了如何使用 Hapi 框架实现身份验证。我们使用了 JSON Web Token 和 Bcrypt 程序库,并创建了一个基本的身份验证模块。我们还介绍了如何使用服务器验证策略来保护 API 端点并验证用户凭证。这个模块可以内嵌到你自己的项目中,并提供一个安全的身份验证解决方案。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/677265a16d66e0f9aad8990b