Hapi 使用 Hapi-auth-jwt2 实现 JWT 认证探究

阅读时长 7 分钟读完

前言

JWT(JSON Web Tokens)是一种跨平台的认证和授权方式,越来越多的 Web 应用程序开始采用 JWT 来实现用户认证和保护 API 路由。Hapi 是一个 Node.js 的 Web 应用程序框架,提供了广泛的插件集合,它也支持使用 Hapi-auth-jwt2 插件来实现 JWT 认证。本文将深入探究 Hapi-auth-jwt2 插件的使用,为你提供详细的学习和指导意义。

什么是 JWT 认证

JWT 是一种安全的、JSON 表示的令牌,用于在通信双方之间传递重要信息。JWT 通常用于身份验证和授权。其实现方式是:在用户身份验证成功后,授权服务器生成一个 JSON Web Token 并将其发送回客户端。以后,客户端将该令牌包含在每个对资源服务器的请求中,以便使用该令牌作为验证凭证。

JSON Web Tokens 由三部分组成,分别是 Header、Payload 和 Signature,具体结构如下:

  • Header:标头通常由两部分组成:令牌类型(即 JWT)和所使用的加密算法(例如 HMAC SHA256 或 RSA)。
  • Payload:载荷包含你想要传递的信息,例如用户 ID 等。Payload 有三个类型:注册声明、公共声明、私有声明。
  • Signature:用于验证消息是未被篡改的,需要使用密钥(secret),才能对消息进行签名。

Hapi-auth-jwt2 的基本使用

Hapi-auth-jwt2 插件是 Hapi 框架中的一个认证插件,它可以用来验证和处理 JSON Web Tokens。本节将为你介绍使用 Hapi-auth-jwt2 来实现基本的 JWT 认证。

安装 Hapi-auth-jwt2 与 jsonwebtoken

在使用 Hapi-auth-jwt2 插件之前,你需要在你的项目中先安装它和 jsonwebtoken 库,可以通过 npm 快速安装:

注册 Hapi-auth-jwt2 插件

注册 Hapi-auth-jwt2 插件非常简单,只需通过 server.register() 方法注册即可。在注册过程中,需要提供 JWT 的验证函数,该函数将在请求到达路由之前被调用。

-- -------------------- ---- -------
----- -------------------------------------------

--------------------------- ------ -
  ---- ------------------          -- ------ --- ---- ----
  --------- ----- --------- -- -- - -- -- --- ------
    ----- - ------ - - ----------
    ----- ---- - ----- -------------------------------------
    ------ - -------- ------ --
  --
  -------------- - ----------- --------- - -- --------------
---

---------------------------

上述代码代码片段中的代码非常简单,其中通过调用 server.register() 方法注册了 Hapi-auth-jwt2 插件,并通过 server.auth.strategy() 方法来定义插件的验证策略。

保护路由

完成插件设置后,你的路由现在可以保护了,并且只能被经过身份验证的用户访问到。你可以在路由配置文件的 auth 属性中指定验证策略,这样只有经过身份验证的用户才能访问该路由:

-- -------------------- ---- -------
-
  ------- ------
  ----- -----------------
  -------- -
    ----- -----
  --
  -------- ----- --------- -- -- -
    ----- - ------ - - ---------------------------
    ----- ---- - ----- ------------------------------------------------------
    ------ - ---- --
  -
-

Auth 验证策略的名称需要与 server.auth.strategy() 方法中相同的名称(在例子中是基于“jwt”)。

现在,当你尝试访问未经身份验证的资源时,你会收到一个 401(身份验证失败)状态。

指定 JWT Token

在使用 Hapi-auth-jwt2 插件进行身份验证时,你需要使用者提供有效的 JWT Token,通常会将 Token 作为 HTTP 请求头部的 Authorization 参数传入。

在路由处理程序中,你可以使用 h.request.auth.credentials 属性,它将返回解密的 JWT Token 的内容,例如用户 ID。

使用 Refresh Token

JWT Token 是有过期时间的,当 JWT Token 过期后,用户需要使用新的 JWT Token 来重新访问受保护的路由。这时,你可以使用 Refresh Token 来获得新的 JWT Token。Refresh Token 的原理就是提供一个带有过期时间和 JWT Token 签名的 Token 来获取新的 JWT Token。

在 Hapi-auth-jwt2 插件中,你需要重写插件的验证策略,来支持 JWT Token 和 Refresh Token 的验证。并且,创建一个支持刷新的路由,由此来更新 JWT Token,如下代码所示:

-- -------------------- ---- -------
----------------------------------- ------ -
  ---- ------------------
  --------- ----- --------- -- -- -
    ----- - ------ - - ----------
    ----- ---- - ----- -------------------------------------
    ------ - -------- ------ --
  --
  -------------- - ----------- --------- --
  ------- ------
  ---------- ------
  ---------- ---------
---

--------------
  -
    ------- -------
    ----- ---------------------
    -------- -
      ----- --------------
      -------- ----- --------- -- -- -
        ----- - ----------- - - -------------
        ----- ----- - ---------- --- -------------- -- ------------------ - ---------- -- ----- ---
        ------ - ----- --
      -
    -
  -
---

上述代码片段中的代码非常简单,通过使用自定义 tokenType 属性,并重写 server.auth.strategy() 方法,在路由中指定验证方法,从而实现刷新 JWT Token 的功能。

结论

Hapi-auth-jwt2 是实现 JWT 认证的一个强大插件,它提供了很多出色的特性,使得它非常适合在 Hapi 框架中进行身份验证和授权。在此文中,我们提供了一个使用 Hapi-auth-jwt2 实现 JWT 认证的基本教程,其中包括如何保护你的路由,如何指定 JWT Token 和如何使用 Refresh Token。如果你在开发过程中需要身份验证和授权,这些信息将对实现这些目标非常有帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674bdc09d657e1f70dc1ab1b

纠错
反馈