在前端开发中,处理请求路由和认证是非常重要的一部分。Hapi 是一个流行的 Node.js Web 开发框架,它提供了一组强大的工具来简化路由和认证的处理。本文将介绍 Hapi 的路由和认证基础知识,帮助你更好地理解如何使用 Hapi 构建 Web 应用。
路由
在 Hapi 中,路由是用来处理 URL 路径和 HTTP 方法的映射。当客户端请求某个 URL 路径时,Hapi 将寻找匹配该路径的路由处理函数,并返回响应给客户端。路由包括了许多组件,例如路径、方法、处理函数、请求验证、响应格式等等。
路径和方法
在 Hapi 中,路由使用 server.route()
方法来添加。路由包括路径和方法两个基本属性:
// 创建一个带有 GET 方法的路由 server.route({ method: 'GET', path: '/hello', handler: (request, h) => { return 'Hello, World!'; } });
在上面的例子中,我们创建了一个 GET 方法的路由,其路径为 /hello
。当客户端发出带有该路径和 GET 方法的请求时,路由处理程序会返回字符串 'Hello, World!'
作为响应。
处理函数
处理函数是处理路由请求的逻辑代码的地方。可以使用异步函数、Promise、genarator 等方式来定义处理函数,代码如下:
-- -------------------- ---- ------- -- ------ --- -------------- ------- -------------- ------- ------ ----- ------------- -------- ----- --------- -- -- - ----- - -- - - --------------- ----- ---- - ----- ------------------ ------ ----- - ---
在上面的例子中,我们创建了一个 GET 方法的路由,路径为 /user/{id}
,其中 {id}
是一个路由参数,用于传递用户 ID 值。当客户端发出带有该路径和 GET 方法的请求时,Hapi 会将请求参数保存在 request.params
对象中,并传递给处理函数中。在处理函数中,我们使用 fetchUserData
函数获取用户数据,并将其作为响应返回客户端。
请求验证
在实际的 Web 应用中,通常需要对请求进行验证,例如验证请求头、cookie、查询参数等等。我们可以使用 Hapi 的 validate
选项来进行验证。
-- -------------------- ---- ------- -- ------ --- ------------ ------------- -- -------------- ------- ------ ----- ------------- -------- ----- --------- -- -- - ----- - -- - - --------------- ----- ---- - ----- ------------------ ------ ----- -- -------- - --------- - -------- ------------ -------------- ----------------------- ------------ - - ---
在上面的例子中,我们添加了一个 validate
选项,用于验证请求头中的 authorization
字段。如果请求头中没有该字段或者该字段为空值,请求将被拒绝并返回状态码 400
。
响应格式
在实际应用中,Hapi 的响应格式也是很重要的一部分。Hapi 支持多种响应方式,包括 JSON、HTML、XML、文件流等等。我们可以使用 Hapi 提供的工具类来进行响应。
-- -------------------- ---- ------- -- ------ --- -------- ---- -- -------------- ------- ------ ----- ------------- -------- ----- --------- -- -- - ----- - -- - - --------------- ----- ---- - ----- ------------------ ------ ------------------------------------------ -- -------- - --------- - -------- ------------ -------------- ----------------------- ------------ - - ---
在上面的例子中,我们使用 h.response()
方法来创建一个 JSON 格式的响应,并使用 type()
方法指定响应 MIME 类型为 application/json
。
认证
在 Web 应用中,认证是一种保护资源的方式,确保只有授权用户才可以访问受保护的资源。Hapi 提供了一组简单而强大的工具用于处理认证,例如基于 cookie 的认证、JWT 认证和 OAuth 2.0 服务端认证等等。
基于 cookie 的认证
基于 cookie 的认证是一种简单的认证方式,适用于保护内部资源。在 Hapi 中,可以使用 h.state()
方法来设置 cookie,使用 request.state()
方法来获取 cookie。
-- -------------------- ---- ------- -- -- ------ ------------------------- - ---- -- - -- - -- - ----- -- ----- - - --------- ------- -- ------ --------- ----- -- ----- ----- -- ----- --- -- -- ------ --- --- -- ------ --- -------- ------ -- -------------- ------- ------ ----- --------- -------- --------- -- -- - ----- --------- - ------------------------ -- ---------- -- ----------- - ------ ------- ------------------------------- - ---- - ------ ------- --- -- -------- - - ---
在上面的例子中,我们使用 server.state()
方法创建一个名为 sessionId
的 cookie,并添加到响应中。在路由处理函数中,我们使用 request.state()
方法获取 sessionId
值,并根据其判断用户是否已登录。
JWT 认证
JWT(JSON Web Token)是一种基于 Token 的认证方式,它将用户信息打包成一个加密的 Token,发送给客户端。客户端在发送请求时将 Token 添加到请求中,服务端通过解密 Token 来识别用户身份。
在 Hapi 中,可以使用 h.jwt.sign()
方法创建 JWT,使用 h.jwt.verify()
方法验证 JWT。
-- -------------------- ---- ------- -- ------ --- -------- --- -- -------------- ------- ------ ----- --------- -------- ----- --------- -- -- - ----- - ----- - - ------------------------------ -- -- --- ----- ---- - ----- ------------------- ----------- -- ---- ------ ------- --------------- -- -------- - ----- ----- - ---
在上面的例子中,我们创建了一个基于 JWT 的认证路由,使用 h.jwt.verify()
方法验证请求头中的 JWT,并将 JWT 解密出的用户信息传递给路由处理函数。
OAuth 2.0 认证
OAuth 2.0 是一种广泛使用的认证和授权协议,它定义了多种授权流程,例如授权码流、密码流等等。在 Hapi 中,我们可以使用 hapi-auth-oauth2
支持 OAuth 2.0 认证。
-- -------------------- ---- ------- -- -- ----- --- ---- ----- -------------- - -------- -------- -- - ------ - ------------- ----- --------- -- -- - -- ---- ----- ----------- - --------------------------- ----- ----- - ----- -------------------------------------- -- ---- -- ------- - -- --------- ------ ----------------- ------------ ----- --- - ---- - ------ -------------------- - - - -- -- -- ----- --- ---- ---------------------------- ---------------- ------------------------------ ---------- -- ------ --- -------- ----- --- -- -------------- ------- ------ ----- --------- -------- ----- --------- -- -- - ----- - ----------- - - ------------- -- ---- ------ ------- ---------------------- -- -------- - ----- -------- - ---
在上面的例子中,我们创建了一个基于 OAuth 2.0 认证的路由,并使用 h.authenticated()
方法将令牌绑定到请求上。然后在路由处理函数中,我们使用 request.auth.credentials
来获取令牌。
总结
通过本文,我们学习了 Hapi 的路由和认证基础知识。了解了 Hapi 的路由和认证基础知识,我们可以更好地使用 Hapi 来构建高效、安全的 Web 应用。不同的项目会有不同的需求,合理的使用路由和认证将会更好地满足我们的项目需要。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647ace00968c7c53b0672433