在现代 Web 应用中,身份验证是保护用户数据安全的重要一环。Hapi 是一个开源的 Node.js Web 框架,它提供了一套身份验证插件,以便轻松地在应用程序中实现身份验证流程。
本文将详细讨论如何在 Hapi 中实现身份验证,涵盖以下内容:
- Hapi 身份验证插件介绍
- 安装和配置 Hapi 身份验证插件
- 实现基本的身份验证功能
- 实现基于 JSON Web Token(JWT)的身份验证
Hapi 身份验证插件介绍
Hapi 身份验证插件是一组可用于验证用户身份的插件。它提供了一系列可自定义的方案,包括:
- 基于 cookie 的验证
- 基于 JWT 的验证
- 自定义验证策略
通过使用 Hapi 身份验证插件可以轻松地实现身份验证,使得你可以更专注于业务逻辑的实现,而不用太多关注身份验证的具体实现。
安装和配置 Hapi 身份验证插件
在你的 Hapi 项目中,首先需要安装 "hapi-auth-cookie" 插件或 "hapi-auth-jwt2" 插件(根据你的需求选择插件)。这里以 "hapi-auth-cookie" 插件为例:
npm install hapi-auth-cookie
在你的代码中导入模块:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - --- -------------- -------------------------------------------- ----- -- - -- ----- - ----------------- - ---- - ------------------- ------------- - ---
之后你需要配置身份验证插件的选项。对于 "hapi-auth-cookie" 插件,你可以配置 cookie 的名称和过期时间:
server.auth.strategy('session', 'cookie', { password: '<password_for_cookie_encription>', cookie: 'session', redirectTo: false, isSecure: false, ttl: 24 * 60 * 60 * 1000 });
这里的 password 选项用于加密 cookie,替换成你自己的加密密码。ttl 选项用于定义 cookie 的过期时间(这里是24小时)。
实现基本的身份验证功能
一旦你安装并配置了身份验证插件,你可以开始实现基本的身份验证功能。以下是一个例子,当用户访问受保护的页面时,会要求用户登录:
-- -------------------- ---- ------- -------------- ------- ------ ----- ------------- ------- - ----- ---------- -------- -------- --------- -- - ------ -------- -- ---- ------------ - - ---
上面的示例中,auth 选项用于指定使用哪个验证策略,这里使用的是我们之前定义的 "session" 策略。这意味着只有在用户已登录的情况下才能访问 "/dashboard" 页面。
以下是一个用于呈现登录页面的路由:
-- -------------------- ---- ------- -------------- ------- ------ ----- --------- -------- -------- --------- -- - ------ - ----- ------------- ---------------- ------ ------------------------------------ ------ ----------- ------------- -------------------- ------ ------------------------------------ ------ --------------- ------------- ------------------------ ------ ------------- --------------- ------- -- - ---
然后我们需要在服务器上创建 POST 路由来处理用户提交的表单:
-- -------------------- ---- ------- -------------- ------- ------- ----- --------- -------- -------- --------- -- - ----- - --------- -------- - - ---------------- -- ----- ----- ----------- ------- -------- -- ----- ------ -- --- -------- ----- ------ --- -------- ----------- -- ----- ---- - ----- ----------------------------- -- ----- ------- - ----- ------------------------ --------------- -- ---- -- ---- ---------- ----- ------- - ----- -- --------- - ------------------------ -------- --- ------ ------------------------- - ---- - ------ -------- ----- ------------- - - ---
在这个路由处理程序中,我们首先获取通过 POST 请求提交的表单数据(用户名和密码)。然后,我们可以将这些凭据与数据库或其他数据源中存储的凭据进行比较,以验证用户身份。在本示例中,我们省略了验证步骤,并将用户名存储在 cookie 中作为已验证用户的标记。
最后,我们将用户重定向到 "/dashboard" 页面,并呈现欢迎消息。这时,如果再次访问 "/dashboard" 页面,将不再需要进行登录操作。
实现基于 JSON Web Token(JWT)的身份验证
除了基于 cookie 的身份验证,Hapi 身份验证插件还支持其他身份验证方案,如基于 JSON Web Token(JWT)的身份验证。
首先,你需要安装 "hapi-auth-jwt2" 插件:
npm install hapi-auth-jwt2
在你的代码中导入模块并注册插件:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - --- -------------- ------------------------------------------ ----- -- - -- ----- - ----------------- - ---- - ------------------- ------------- - ---
然后你需要配置身份验证插件的选项。对于 "hapi-auth-jwt2" 插件,你需要提供一个密钥,用于签署 JSON Web Token:
-- -------------------- ---- ------- --------------------------- ------ - ---- -------------------- --------- ----- --------- -------- -- -- - -- ------- ------ ---------- ---- ------ - -------- ----- ------------ -------- - -- -------------- - ----------- - ------- - - ---
在这个示例中,我们配置了一个 "jwt" 验证策略,其 key 选项用于指定用于签署 JSON Web Token 的私钥。我们还提供了一个 validate 函数,以便在 token 解码后对其进行自定义验证。在本示例中,我们只是返回一个布尔值,表示 token 是有效的。
最后,我们需要在路由处理程序中使用 "jwt" 验证策略:
-- -------------------- ---- ------- -------------- ------- ------- ----- --------- -------- -------- --------- -- - ----- - --------- -------- - - ---------------- -- ----- ----- ----------- ------- -------- -- ----- ------ -- --- -------- ----- ------ --- -------- ----------- -- ----- ---- - ----- ----------------------------- -- ----- ------- - ----- ------------------------ --------------- -- ---- -- ---- ---------- ----- ------- - ----- -- --------- - ----- ----- - ---------- -------- -- -------------------- - ---------- ---- --- ------ - ------ -- - ---- - ------ -------- ----- ------------- - - --- -------------- ------- ------ ----- ------------- ------- - ----- ------ -------- -------- --------- -- - ------ -------- -- ---- ------------ - - ---
在登录处理程序中,我们使用 "jwt.sign" 函数来生成一个带有用户名负载的 token。这里的 token 在登录后通过 HTTP 响应返回给客户端,客户端可以将其存储在 localStorage 中以供今后使用。
然后在 "/dashboard" 路径的路由处理程序中,我们将 auth 选项设置为 "jwt",这表示只有带有正确的 token 的请求才能访问该页面。
总结
在本文中,我们介绍了如何在 Hapi 中使用身份验证插件,在应用程序中快速实现基于 cookie 或 JSON Web Token 的身份验证。希望这篇文章能为你提供详细的指导和学习资料。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6454ddca968c7c53b089a71e