在 Deno 中使用 JSON Web Token 实现鉴权

阅读时长 7 分钟读完

在现代的 Web 应用中,鉴权是一个非常重要的方面。在鉴权中,JSON Web Token(JWT)是一个突出的选择。JWT 是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于在各方之间安全地传输信息,通常在 HTTP Header 中使用。

在本篇文章中,我们将介绍如何在 Deno 中使用 JWT 实现鉴权,并且说明其意义和实现方法。我们的文章将包括以下内容:

  1. JWT 的概念和原理
  2. 在 Deno 中如何生成和验证 JWT
  3. 在 Deno Web 应用中使用 JWT 鉴权

JWT 的概念和原理

JWT 包含了一些基本信息,例如签发人(issuer)、过期时间(expire)和主题(subject),以及可选的附加信息。JWT 使用 Base64 算法编码,在三段 Base64 编码中间包含 . 分隔符,如下所示:

其中,xxxxx 表示 JWT 的头部,yyyyy 表示 Payload,zzzzz 表示 Signature。这三个部分使用 . 分隔开来。

  • 头部:通常由两部分组成,算法和类型。例如,{"alg":"HS256","typ":"JWT"} 表示 JWT 使用 HS256(HMAC SHA256)算法和 JWT 类型。

  • Payload:包含了 JWT 的主要信息,由一些 claims 组成,一般分为三部分。

    1. 标准字段,例如 iss 对应 JWT 的签发者,sub 对应 JWT 的主题。
    2. 自定义字段:包含了我们需要的数据,例如用户 ID 等信息。
    3. 注册的字段:一些字段是在 IANA 中已经注册,如果要使用可以查询 IANA。
  • Signature:使用头部中指定的算法,对头部和 Payload 中的信息进行加密。

在 Deno 中生成和验证 JWT

在 Deno 中,可以使用第三方库 jwt 来生成和验证 JWT。jwt 实现了对 JWT 的编码和解码,以及签名和验证的功能。安装方式如下:

生成 JWT 的示例代码如下:

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

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

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

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

上述代码中,我们使用了 makeJwt 方法来生成 JWT。我们首先定义了一个加密的密钥,然后设置 JWT 的 Payload,其中设置了签发者、主题和过期时间。最后,我们设置了头部信息,并使用 makeJwt 方法生成 JWT,将 JWT 输出到控制台中。

验证 JWT 的示例代码如下:

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

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

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

上述代码中,我们使用了 validateJwt 方法来验证 JWT。我们首先定义了一个加密的密钥和需要验证的 JWT。随后,我们使用 validateJwt 方法验证 JWT,并根据验证结果输出不同的信息。

在 Deno Web 应用中使用 JWT 鉴权

使用 JWT 鉴权通常应该在请求头上添加一个 Authorization 字段,字段值为 Bearer 加上 JWT,例如:

我们可以在 Deno Web 应用程序中使用 oak,它是一个现代化的 Web 框架,构建 Web 应用程序时是一个非常好的选择。在使用 oak 时,可以编写一个 middleware 来实现 JWT 的鉴权。

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

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

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

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

上述代码中,我们首先定义了一个加密的密钥和一个 middleware 函数 jwtMiddleware。在 jwtMiddleware 中,我们首先获取 Authorization 头部,并验证其格式是否正确。随后,我们从 Authorization 头部中获取 JWT,并使用 validateJwt 方法验证 JWT。最后,我们使用 await next() 继续执行下一个 middleware,如果验证失败返回 401 响应。

在进行路由注册时,可以使用 jwtMiddleware 来限制该路由的访问。

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

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

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

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

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

上述代码中,我们创建了一个 users 路由,路由可以在 JWT 鉴权通过时访问。在注册路由时,我们使用 app.use(jwtMiddleware) 来指定需要鉴权的路由。

总结

在本篇文章中,我们详细讲解了如何在 Deno 中使用 JWT 实现鉴权。我们首先介绍了 JWT 的概念和原理,随后讲解了在 Deno 中生成和验证 JWT 的方法。最后,我们使用 oak 框架编写了一个 middleware 来实现 JWT 鉴权,以及如何限制路由的访问。希望本篇文章对您在使用 Deno 中的鉴权方案有所启发。

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

纠错
反馈