在现代的 Web 应用中,鉴权是一个非常重要的方面。在鉴权中,JSON Web Token(JWT)是一个突出的选择。JWT 是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于在各方之间安全地传输信息,通常在 HTTP Header 中使用。
在本篇文章中,我们将介绍如何在 Deno 中使用 JWT 实现鉴权,并且说明其意义和实现方法。我们的文章将包括以下内容:
- JWT 的概念和原理
- 在 Deno 中如何生成和验证 JWT
- 在 Deno Web 应用中使用 JWT 鉴权
JWT 的概念和原理
JWT 包含了一些基本信息,例如签发人(issuer)、过期时间(expire)和主题(subject),以及可选的附加信息。JWT 使用 Base64 算法编码,在三段 Base64 编码中间包含 . 分隔符,如下所示:
xxxxx.yyyyy.zzzzz
其中,xxxxx 表示 JWT 的头部,yyyyy 表示 Payload,zzzzz 表示 Signature。这三个部分使用 . 分隔开来。
头部:通常由两部分组成,算法和类型。例如,{"alg":"HS256","typ":"JWT"} 表示 JWT 使用 HS256(HMAC SHA256)算法和 JWT 类型。
Payload:包含了 JWT 的主要信息,由一些 claims 组成,一般分为三部分。
- 标准字段,例如 iss 对应 JWT 的签发者,sub 对应 JWT 的主题。
- 自定义字段:包含了我们需要的数据,例如用户 ID 等信息。
- 注册的字段:一些字段是在 IANA 中已经注册,如果要使用可以查询 IANA。
Signature:使用头部中指定的算法,对头部和 Payload 中的信息进行加密。
在 Deno 中生成和验证 JWT
在 Deno 中,可以使用第三方库 jwt
来生成和验证 JWT。jwt
实现了对 JWT 的编码和解码,以及签名和验证的功能。安装方式如下:
deno install --allow-net --allow-read https://deno.land/x/djwt/c/mod.ts
生成 JWT 的示例代码如下:
-- -------------------- ---- ------- ------ - -------- -------------- ----- ------- - ---- ------------------------------------ ----- --- - -------------- ----- -------- ------- - - ---- -------------- ---- --------------- ---- ----------------- ---------------- - -- - -- - ------ -- ----- ------- ---- - - ---- -------- ---- ------ -- ----- ----- - ----- --------- ------- ------- -- ----- -------------------
上述代码中,我们使用了 makeJwt
方法来生成 JWT。我们首先定义了一个加密的密钥,然后设置 JWT 的 Payload,其中设置了签发者、主题和过期时间。最后,我们设置了头部信息,并使用 makeJwt
方法生成 JWT,将 JWT 输出到控制台中。
验证 JWT 的示例代码如下:
-- -------------------- ---- ------- ------ - ------------ ------------- - ---- ----------------------------------------- ----- --- - -------------- ----- ----- - ------------- ----- ---- ------------- - ----- ------------------ ----- -- -------------- - -------------------- ------ - ---- - ------------------ ------ -
上述代码中,我们使用了 validateJwt
方法来验证 JWT。我们首先定义了一个加密的密钥和需要验证的 JWT。随后,我们使用 validateJwt
方法验证 JWT,并根据验证结果输出不同的信息。
在 Deno Web 应用中使用 JWT 鉴权
使用 JWT 鉴权通常应该在请求头上添加一个 Authorization 字段,字段值为 Bearer 加上 JWT,例如:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ5b3VyLWlzc3VlciIsInN1YiI6InlvdXItc3ViamVjdCIsImV4cCI6MTYxMTUyMjUyMH0.wYKjkiNulxfgaDiS-4M1AfVPyusjKQ2XO4zh4J0_jY4
我们可以在 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