前言
在 Web 应用程序中,用户认证和授权是非常重要的功能。JWT(JSON Web Token)是一种流行的实现方式,可以在客户端和服务器之间传递安全的信息。Deno 是一个新兴的 JavaScript 和 TypeScript 运行时环境,它提供了一种安全的方式来编写服务器端应用程序。本文将介绍如何在 Deno 中使用 JWT 实现用户认证和授权。
什么是 JWT?
JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式来在两个实体之间安全地传输信息。JWT 主要用于在客户端和服务器之间传递身份验证和授权数据。JWT 由三个部分组成:头部、载荷和签名。头部包含算法和类型信息,载荷包含实际的数据,签名用于验证数据的完整性和真实性。
在 Deno 中使用 JWT
在 Deno 中使用 JWT,我们需要安装一个 JWT 库。这里我们使用一个名为 "djwt" 的库,它是一个简单而强大的 JWT 库。我们可以使用 Deno 的内置模块管理器 "deno.land/std" 来安装它。
deno install --allow-read --allow-write --allow-net https://deno.land/x/djwt/install.ts
安装完成后,我们可以在代码中引入它:
import * as djwt from "https://deno.land/x/djwt/mod.ts";
生成 JWT
在用户登录成功后,我们可以生成一个 JWT 并将其返回给客户端。JWT 的载荷可以包含任何有意义的数据,例如用户 ID、用户名、角色等。下面是一个示例代码:
// javascriptcn.com 代码示例 const header: djwt.Jose = { alg: "HS256", typ: "JWT", }; const payload: djwt.Payload = { iss: "example.com", sub: "1234567890", iat: Date.now(), exp: Date.now() + 60 * 60 * 1000, // 过期时间为 1 小时 name: "John Doe", roles: ["admin", "user"], }; const key = "secret-key"; // 密钥,可以从配置文件中读取 const jwt = await djwt.create({ header, payload, key });
在上面的代码中,我们定义了一个 JWT 的头部和载荷,并使用密钥生成了一个 JWT。
验证 JWT
在客户端发送请求时,我们需要验证 JWT 的有效性。验证 JWT 主要涉及到以下两个步骤:
- 验证 JWT 的签名是否正确。
- 验证 JWT 是否已经过期。
下面是一个示例代码:
// javascriptcn.com 代码示例 const jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJleGFtcGxlLmNvbSIsInN1YiI6IjEyMzQ1Njc4OTAiLCJpYXQiOjE2MjY0MjYzMTUsImV4cCI6MTYyNjQyOTkxNSwibmFtZSI6IkpvaG4gRG9lIiwicm9sZXMiOlsiYWRtaW4iLCJ1c2VyIl19.6d2Q1v8nKj2s1sRnXJkxjKgZmzD3YiJfPqKjvGWSykg"; const key = "secret-key"; // 密钥,可以从配置文件中读取 const { payload } = await djwt.verify(jwt, key, "HS256"); if (Date.now() > payload.exp) { // JWT 已经过期 } else { // JWT 验证成功 }
在上面的代码中,我们使用密钥验证了 JWT 的签名,并检查了 JWT 是否已经过期。
使用 JWT 实现用户认证和授权
使用 JWT 实现用户认证和授权的基本思路如下:
- 用户登录成功后,生成一个 JWT 并将其返回给客户端。
- 客户端在发送请求时,将 JWT 放在请求头中。
- 服务器在接收到请求后,验证 JWT,并根据 JWT 的载荷信息进行用户认证和授权。
下面是一个示例代码:
// javascriptcn.com 代码示例 import { serve } from "https://deno.land/std/http/server.ts"; import * as djwt from "https://deno.land/x/djwt/mod.ts"; const key = "secret-key"; // 密钥,可以从配置文件中读取 const server = serve({ port: 8080 }); for await (const req of server) { const authHeader = req.headers.get("Authorization"); if (!authHeader) { req.respond({ status: 401, body: "Unauthorized" }); continue; } const [type, jwt] = authHeader.split(" "); if (type !== "Bearer") { req.respond({ status: 401, body: "Unauthorized" }); continue; } try { const { payload } = await djwt.verify(jwt, key, "HS256"); if (Date.now() > payload.exp) { req.respond({ status: 401, body: "Unauthorized" }); continue; } // 用户认证和授权逻辑 // ... req.respond({ status: 200, body: "OK" }); } catch (error) { req.respond({ status: 401, body: "Unauthorized" }); } }
在上面的代码中,我们使用了 Deno 的 HTTP 服务器模块来创建了一个简单的 Web 服务器。在每个请求中,我们从请求头中获取了 JWT,并验证了其有效性。如果 JWT 验证成功,我们可以根据 JWT 的载荷信息进行用户认证和授权。如果 JWT 验证失败,我们将返回 "Unauthorized"。
总结
本文介绍了如何在 Deno 中使用 JWT 实现用户认证和授权。JWT 是一种非常流行的实现方式,它可以在客户端和服务器之间传递安全的信息。在 Deno 中,我们可以使用 "djwt" 库来生成和验证 JWT。通过本文的学习,您应该可以掌握如何使用 JWT 在 Deno 中实现用户认证和授权的基本思路。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6559a61ad2f5e1655d40fe4d