Deno 是一个新的 JavaScript 和 TypeScript 运行时环境,相较于 Node.js 来说,Deno 更安全、稳定、轻量级。因此,越来越多的前端开发者开始使用 Deno 开发后端应用。而在实际应用中,鉴权管理是不可或缺的一部分,JWT 又是当下最为流行的鉴权方式之一。本文将介绍如何在 Deno 应用中使用 JWT 进行鉴权管理。
什么是 JWT?
JWT(JSON Web Token)是一种开放标准,它定义了一种规范,用于通过安全的方式在不同的系统之间传输信息。JWT 由三部分组成,分别是头部、载荷和签名,例如下面的字符串:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
头部包含了算法和令牌类型,载荷包含了需要传递的信息,签名通过私钥进行加密,用于验证令牌的有效性和完整性。JWT 不仅可以用于身份验证和授权,还可以在服务器端和客户端之间传递数据,是一种非常方便的鉴权方式。
安装 JWT 模块
为了在 Deno 应用中使用 JWT,我们需要使用 third_party 模块系统,通过下面的命令安装 jwt 模块:
deno install --allow-net --allow-read https://deno.land/x/djwt/install.ts
其中,--allow-net
表示允许网络访问,--allow-read
表示允许读取文件权限。
创建 JWT
在 Deno 中,我们可以使用 djwt 模块提供的 create
函数创建一个 JWT:
import { create } from "https://deno.land/x/djwt/mod.ts"; const payload = { name: "Tom", age: 20 }; const key = "secretkey"; const token = await create({ alg: "HS512", typ: "JWT" }, payload, key); console.log(token);
在上面的示例中,create
函数接收三个参数:头部、载荷和私钥。我们可以通过 alg
参数指定使用哪种加密算法,密钥越长,安全性越高,我在这里使用了 HS512 算法,并将密钥设为 "secretkey"。
解析 JWT
在接收到前端发送来的 JWT 后,我们需要对其进行解析,确定其有效性,这可以使用 djwt 模块提供的 verify
函数实现:
import { verify } from "https://deno.land/x/djwt/mod.ts"; const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"; const key = "secretkey"; const { payload, header } = await verify(token, key, "HS512"); console.log(payload);
在这里,我们将前面生成的 token 和密钥 "secretkey" 传入 verify
函数,第三个参数是指定加密算法。解析后的有效负载(payload)包含了前面在创建 JWT 时存储的信息。
在 HTTP 请求中使用 JWT
假设我们需要在 Deno 应用的 POST /login
接口进行用户验证,以下是一个使用 JWT 在 HTTP 请求中进行鉴权的示例代码:
// javascriptcn.com 代码示例 import { Application, Router, Context } from "https://deno.land/x/oak/mod.ts"; import { create, verify } from "https://deno.land/x/djwt/mod.ts"; const app = new Application(); const router = new Router(); const key = "secretkey"; router.post("/login", async (ctx: Context) => { const { username, password } = await ctx.request.body().value; // 验证用户信息,如果通过则生成 token if (verifyUser(username, password)) { const token = await create({ alg: "HS512", typ: "JWT" }, { username }, key); ctx.response.body = { token }; } else { ctx.response.status = 401; ctx.response.body = { error: "Unauthorized" }; } }); router.get("/profile", async (ctx: Context) => { const token = ctx.request.headers.get("Authorization"); if (!token) { ctx.response.status = 401; ctx.response.body = { error: "Unauthorized" }; return; } try { const { payload, header } = await verify(token, key, "HS512"); ctx.response.body = { profile: payload }; } catch (error) { ctx.response.status = 401; ctx.response.body = { error: "Unauthorized" }; } }); app.use(router.routes()); app.use(router.allowedMethods()); await app.listen({ port: 8000 });
在上面的示例代码中,我们使用 verifyUser()
函数验证用户信息,并根据结果创建 JWT,并将其返回给客户端。在 GET /profile
接口中,我们首先从 HTTP 请求中获取 token,然后使用 verify
函数进行解析和验证,如果验证通过,则返回用户信息,否则返回 401 错误。
总结
在本文中,我们介绍了如何在 Deno 应用中使用 JWT 进行鉴权管理,包括创建 JWT、解析 JWT 和在 HTTP 请求中使用 JWT。JWT 不仅安全可靠,还易于使用,适合用于任何需要鉴权的场景。如果你正在开发 Deno 应用,不妨考虑使用 JWT 进行鉴权,提高应用程序的安全性和可靠性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653ce6807d4982a6eb6da18b