Hapi 是一个用于构建 Web 应用的 Node.js 框架,它有许多可扩展的插件,其中 Authentication 插件是那些需要鉴权或授权的应用场景下非常重要的一个。本篇文章旨在提供一个完整的指南,介绍如何使用 Hapi 和 Authentication 插件构建一个具有用户认证和授权的 Web 应用程序。
安装和配置 Hapi
要开始使用 Hapi 框架,首先需要安装 Node.js 和 npm(Node.js 包管理器)。安装完毕后,可以通过下面的命令安装 Hapi:
npm install hapi
接下来需要在项目的根目录中创建一个 server.js
文件,然后使用以下代码来初始化一个 Hapi 服务器:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- --- -------------- ------- ------ --------- -------- --------- -- -- - ------ ------ -------- - --- ----- --------------- ------------------- ------- --- --------------------- -- -------
上面的代码创建了一个 Hapi 服务器并监听 localhost:3000
上的请求。这里只定义了一个路由,当用户访问根路径时,服务器将返回 “Hello World!”。启动服务器后,可以在浏览器中访问 http://localhost:3000
,看到 “Hello World!” 的输出。
安装和配置 Authentication 插件
为了启用用户认证和授权,需要安装和配置 Hapi-auth-cookie 插件,它提供了一个基于 Cookie 的身份验证策略来轻松地实现身份验证和会话管理。安装 Hapi-auth-cookie 插件的命令如下:
npm install @hapi/cookie
安装后,需要在 Hapi 服务器中加载插件:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - ------------------------ ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- --- ----- ------------------------ -------------- ------- ------ --------- -------- --------- -- -- - ------ ------ -------- - --- ----- --------------- ------------------- ------- --- --------------------- -- -------
在上面的代码中,server.register(Cookie)
加载了 Hapi-auth-cookie 插件。成功加载后,可以使用 server.auth.strategy
函数来定义一个身份验证策略:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - ------------------------ ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- --- ----- ------------------------ ------------------------------- --------- - ------- - ----- ------ --------- -------------- -- ---- ------ ------- --------- ----- -- ----------- --------- --------- ------ ------------- ----- --------- -------- -- - -- ---- -- -------- ----- ---- - ----- --------------------------------- ------ - ------ ---- - ---- - ----- -- - --- ------------------------------- -------------- ------- ------ ----- ---- -------- ----- --------- -- -- - ------ ------ -------- - --- ----- --------------- ------------------- ------- --- --------------------- -- -------
server.auth.strategy('session', 'cookie', {...})
定义了一个名为 session
的身份验证策略,基于 Cookie 并使用一个传输到浏览器的令牌来管理用户身份。选项对象包含一些属性,如 name
、password
、isSecure
等。其中 name
是 Cookie 的名称,password
是一个编码密码,用于解密浏览器发送的 Cookie 值,isSecure
表示 Cookie 是否应该只通过 HTTPS 连接发送(不建议在开发环境中使用 HTTPS),redirectTo
表示用户未经身份验证时应该重定向到的 URL,validateFunc
是一个验证函数,用于验证当前请求的 Cookie 和存储在服务器上的凭证是否匹配。
server.auth.default('session')
将 session
身份验证策略设置为默认策略。
创建登录和登出路由
现在已经准备好了身份验证和身份验证策略,可以创建一个登录路由并在其中使用 request.cookieAuth.set()
方法来设置有效会话的 Cookie。在这个示例中,我们将在路由处理程序中设置一个带有用户名和密码的静态 IIFE 函数来进行用户认证。
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - ------------------------ ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- --- ----- ------------------------ ------------------------------- --------- - ------- - ----- ------ --------- -------------- --------- ----- -- ----------- --------- --------- ------ ------------- ----- --------- -------- -- - ----- ---- - ----- --------------------------------- ------ - ------ ---- - ---- - ----- -- - --- ------------------------------- -------------- ------- ------- ----- --------- -------- ----- --------- -- -- - ----- - --------- -------- - - ---------------- ----- --------------- - ----- ------ -- -- - ----- ---- - ----- -------------------------------- ---------- -- ------ ----- ------------------------ --- ------- --- ------ -------------- ----- ------ --------------- - ------- ---- - ---------- -------- -- ----------- -- -------- - ----- ----- - --- -------------- ------- ------ ----- ---------- -------- --------- -- -- - --------------------------- ------ ------- ------ - --- -------------- ------- ------ ----- ---- -------- --------- -- -- - ------ ------ -------- - --- ----- --------------- ------------------- ------- --- --------------------- -- -------
上面的代码中,新路由是 POST /login
和 GET /logout
。登录路由将{username, password}
的用户凭证作为负载传递,并使用 getUserFromCredentials
函数验证这些凭证。如果凭据是有效的,则通过调用 request.cookieAuth.set({ id: user.id })
将会话 ID 存储到 Cookie 中,以便重新验证时可以读取。最后,如果用户已通过身份验证,则返回一条“Logged in!” 的响应消息,反之则显示 “Incorrect username or password!” 。
登出路由从 request.cookieAuth.clear()
方法中清除会话 ID,以删除客户端 Cookie 中存储的凭证。
保护路由
现在,可以使用 auth
选项来保护希望授权访问的路由。 Hapi 的路由处理程序接受两个参数:一个请求对象和 h
对象(它是一个用于服务器响应的工具)。
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - ------------------------ ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- --- ----- ------------------------ ------------------------------- --------- - ------- - ----- ------ --------- -------------- --------- ----- -- ----------- --------- --------- ------ ------------- ----- --------- -------- -- - ----- ---- - ----- --------------------------------- ------ - ------ ---- - ---- - ----- -- - --- ------------------------------- -------------- ------- ------- ----- --------- -------- ----- --------- -- -- - ----- - --------- -------- - - ---------------- ----- --------------- - ----- ------ -- -- - ----- ---- - ----- -------------------------------- ---------- -- ------ ----- ------------------------ --- ------- --- ------ -------------- ----- ------ --------------- - ------- ---- - ---------- -------- -- ----------- -- -------- - ----- ----- - --- -------------- ------- ------ ----- ---------- -------- --------- -- -- - --------------------------- ------ ------- ------ - --- -------------- ------- ------ ----- ------------- -------- --------- -- -- - ------ ---------- -------- -- -------- - ----- --------- - --- ----- --------------- ------------------- ------- --- --------------------- -- -------
上面的代码中,GET /protected
路由已经添加了 options.auth: 'session'
。这表示客户端必须提供有效的身份验证 Cookie 才能访问该路由。如果没有提供任何 Cookie,则会自动重定向到 redirectTo
选项指定的 URL。
结论
在本文中,我们了解了如何使用 Hapi 和 Authentication 插件构建具有用户认证和授权的网络应用程序。 我们学习了如何安装和配置 Hapi-auth-cookie 插件,如何使用插件来实现身份验证和会话管理,并演示了如何设置登录和登出路由以及保护某些路由以进行授权。希望这篇文章对你有帮助,可以在日后的开发中更快地创建更加安全的应用程序。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f28deca44b36ee57665a15