前言
在 web 应用中,用户身份认证是一个非常重要的过程。传统身份验证方式通常是基于 cookie 或 session 实现的,但这些方式需要额外的服务器存储并且容易遭受 CSRF 攻击。JWT(JSON Web Token)是一种比较先进的认证方式,通过在客户端生成令牌,而无需在服务器端进行存储从而提供更加安全的认证机制。本篇文章将介绍如何在 Hapi 框架中使用 JWT 进行身份认证。
JWT 概述
JWT 由三部分构成:头部、载荷和签名。头部包含令牌类型和使用的签名算法,载荷包含令牌的信息,签名可以确保 token 的不可篡改和真实性。
-- -------------------- ---- ------- -- ---------- - --------- ---- ----------- --------- - -- ---------------- - ------ -------- ------ ----- - -- -------------- - ------ ---- ------- ---------- ------ ---------- - -- --------------------- ----- --- ----------- ----------------------- - --- - ------------------------- -------
安装 Hapi 和相关插件
在开始编写代码之前,需要安装以下依赖:
- hapi - Node.js web 应用框架
- hapi-auth-jwt2 - Hapi 的 JWT 认证插件
- jsonwebtoken - JWT 生成和验证库
npm install --save hapi hapi-auth-jwt2 jsonwebtoken
创建并配置 Hapi 服务器
以下是一个简单的 Hapi 服务器:
-- -------------------- ---- ------- ----- ---- - --------------- ----- ------ - ------------- ----- ------------ ----- ---- -- -------------- ------- ------ ----- ---- -------- --------- -- -- ------- ------- -- --------------
配置 JWT 认证策略
接下来,需要配置 JWT 认证策略。在 Hapi 中,可以使用 server.auth.strategy
方法来实现。hapi-auth-jwt2
插件提供了一个默认的解析 JWT 的逻辑,我们可以通过配置 validate
方法来实现对令牌的验证。下面是一个例子:
-- -------------------- ---- ------- ----- ---- - --------------- ----- --- - ----------------------- ----- ------- - ------------------------- ----- ------ - ------------- ----- ------------ ----- ---- -- -- --- ---- ----- ---------- - --------------- -- ------ ------------------------ --- -- - -- ----- - ---------------- - ----------------------------- ------ - ---- ----------- --------- ----- --------- -------- -- -- - -- ---------- --- --- -- ------------ --- ---------- - ------ --------- ------- - ------ --------- ------ -- -------------- - ----------- --------- - -- -- -------------- ------- ------ ----- ---- -------- --------- -- -- - -- -------- ----- ----- - --------------------------------------------- -- --- -- ---- ----- ------- - ----------------- ----------- ------ ------- ----------------- -- -------- - ----- ------- - -- --------------
如上所示,我们需要实现 validate
方法来验证解密后的令牌。在这个例子中,我们简单地验证令牌是否包含了 sub
字段来判断令牌是否是有效的。同时,使用 Bearer
的方式从请求头部获取令牌,遵循 HTTP 字段规范。
最后,需要设置 options.auth
属性为 token
来指示 Hapi 使用 token
认证策略进行身份验证。
生成 JWT 令牌
客户端需要先通过身份验证获取 JWT 令牌,然后在后续请求中将令牌添加到 Authorization 头部。下面是一个在 Node.js 中生成 JWT 令牌的例子:
-- -------------------- ---- ------- ----- --- - ----------------------- ----- ---------- - --------------- ----- ------- - - ---- ---- ----- --------- - ----- ----- - ----------------- ----------- - ---------- -- - -- -- - -- -- ------------------
最后,开启服务器并使用 HTTP 客户端向服务器发送带身份认证的请求即可完成身份认证过程。
curl --request GET \ --url http://localhost:3000/ \ --header 'authorization: Bearer <JWT_TOKEN>'
总结
本文介绍了如何在 Hapi 框架中使用 JWT 进行身份认证。通过使用 hapi-auth-jwt2 插件,我们能够方便地实现 JWT 的认证机制,并通过简单的示例代码演示了如何在 Hapi 中使用 JWT 进行身份认证。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f6a3def6b2d6eab3f37a3d