最近,随着 JavaScript 运行时的多样化,Deno 成为了前端语言的又一重要选择。对于 Web 应用,身份认证永远是关键的一环。本文将讲解如何在 Deno 中实现 JWT 身份认证,帮助读者深入了解这个常用而重要的认证方式。
JWT 简介
JWT(JSON Web Token)是由 JSON 标准定义的一种 token 格式。在计算机网络中间传递信息,以及在基于 token 的身份验证方案中作为 token 使用。JWT 通常由三部分组成,使用点号(.)分隔:
- Header:JWT 的头部,通常包含两部分:令牌类型(即 JWT)以及所使用的算法,例如
{"alg": "HS256","typ": "jwt"}
。 - Payload:实际需要传输的数据部分,JWT 标准并没有规定数据的具体格式,但它确保这些数据不被篡改。同时,JWT 支持使用自定义的声明来添加要传输的信息。
- Signature:签名部分主要是对前两部分进行哈希并加盐,加密方式可自行定义。
使用 JWT 身份认证的步骤如下:
- 用户使用用户名和密码进行登录。
- 登录成功后,服务器会返回一个 JWT。
- 客户端开始存储该令牌,并将其发送在每个请求的请求头或 cookie 中。该请求将与服务器进行验证,以确保该请求合法。
Deno 环境搭建
在使用 Deno 进行开发时,需要安装 Deno 运行时环境。安装非常简单,只需在终端输入以下命令即可:
curl -fsSL https://deno.land/x/install/install.sh | sh
安装完成后,您可以输入 deno --version
验证是否安装成功。
安装相关依赖
为了实现 JWT 身份认证,你可以通过使用 deno-jwt 这个第三方库来实现。使用 import
命令即可从 Deno.land/x 导入该库。
import { validateJwt, parseAndDecode } from "https://deno.land/x/djwt/validate.ts"; import { makeJwt, setExpiration } from "https://deno.land/x/djwt/create.ts";
实现 JWT 身份认证
使用 deno-jwt 库,我们可以轻松地实现 JWT 身份验证。以一个实际示例为例,这个示例编写了一个 login()
函数和一个使用 JWT 进行身份验证的 authorized()
函数。
// javascriptcn.com 代码示例 import { validateJwt, parseAndDecode } from "https://deno.land/x/djwt/validate.ts"; import { makeJwt, setExpiration } from "https://deno.land/x/djwt/create.ts"; const key = "jwt_example_secret_key"; const algorithm = "HS256"; const header = {alg: algorithm, typ: "JWT"}; interface User { username: string; password: string; role: string; } const users: User[] = [ { username: "Alice", password: "1234", role: "admin" }, ]; function login(username: string, password: string) { const user = users.find((u) => u.username === username && u.password === password); if (user === undefined) { console.log("invalid user."); return null; } const payload = { username: user.username, role: user.role, exp: setExpiration(new Date().getTime() + 5000), }; return makeJwt({ header, payload, key }); } function authorized(token: string) { try { const jwtObject = parseAndDecode(token); if (jwtObject.payload === null) { console.log("null payload."); } const payload = jwtObject.payload; const result = validateJwt(token, key, { algorithms: [algorithm] }); if (result.isValid) { console.log("Authorization passed."); console.log(result.payload); } else { console.log("Authorization failed."); } } catch (e) { console.log(e); } } const JWT = login("Alice", "1234"); authorized(JWT);
这个示例中,login()
函数接收用户名和密码,并验证是否与用户列表中的某个用户匹配。如果成功登录,则返回生成的 JWT。JWT 的 payload 包含了用户名、角色和过期时间。
authorized()
函数接收 JWT,验证其有效性并输出一条消息。
总结
本文详细阐述了如何使用 Deno 实现 JWT 身份验证,并提供了一个实际示例,该示例演示了从用户登录到使用 JWT 进行身份验证所需的步骤,并详细讲解了 deno-jwt 库的用法。希望本文可以对读者对 Deno 和 JWT 的认识有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65016df995b1f8cacdf265a3