在 Web 应用的开发中,用户认证是必不可少的一部分。JWT(Json Web Token) 是一种流行的用户认证方式,它将用户信息封装在了一个 token 中,发送给服务器进行验证,这一过程非常安全可靠。本文将介绍如何在 Deno 中使用 JWT 进行用户认证。
安装 jwt 模块
使用 Deno 进行 Web 开发需要导入相应模块,首先需要安装 jwt 模块。在命令行中输入以下命令即可安装。
deno install --allow-net --allow-read https://deno.land/x/djwt/cli.ts
安装完成后,可以通过 djwt -h
命令查看 djwt 命令的使用方法。
实现用户认证
首先需要创建一个服务端接口,用于用户登录。假设我们已经实现了这个接口,现在需要在接口返回的数据中加入 JWT Token ,并将 Token 发送给客户端。
import { makeJwt, setExpiration, Jose, } from "https://deno.land/x/djwt/mod.ts"; const header: Jose = { alg: "HS256", typ: "JWT", }; const payload = { userId: user.id, exp: setExpiration(new Date().getTime() + 60 * 60 * 1000), }; const key = "my-secret"; // 密钥可以设置为环境变量 const token = makeJwt({header, payload, key}); ctx.response.body = { token, };
在上述代码中,我们通过 makeJwt 函数生成一个 JWT Token ,其中包含了 user 的 id 信息以及过期时间。生成 Token 的过程需要指定算法( alg )、 Token 类型( typ )、有效载荷( payload )和秘钥( key )。生成的 Token 可以直接返回给客户端。
在客户端中,我们将请求到的 Token 缓存起来,之后在访问需要认证的接口时,将 Token 添加到请求头中一并发送给服务端进行鉴权。
const requestOptions = { headers: { Authorization: `Bearer ${token}`, }, }; const response = await fetch('http://localhost:3000/api/users', requestOptions); const data = await response.json();
如果认证成功,服务端会返回用户信息,否则会返回错误信息。在服务端中实现用户认证的过程可以分为以下几步:
获取 Token,检查 Token 是否存在
解码 Token,获取 Payload 中的用户信息
对用户信息进行验证,判断用户是否合法
import { validateJwt, JwtObject, } from "https://deno.land/x/djwt/validate.ts"; const key = "my-secret"; // 密钥可以设置为环境变量 try { const authHeader = ctx.request.headers.get("Authorization"); const token = authHeader ? authHeader.replace("Bearer ", "") : ""; if (!token) { throw new Error("Token not found"); } const jwt: JwtObject = await validateJwt(token, key, { isThrowing: false });// 第三个参数如果设置为 true,则可以直接抛出错误 if (!jwt) { throw new Error("Token is invalid"); } const userId = jwt.payload?.userId; if (!userId) { throw new Error("User not found"); } // 鉴权通过,继续执行业务代码 } catch (error) { ctx.response.status = 401; ctx.response.body = { message: "无效的 Token", }; }
总结
使用 JWT 进行用户认证是一种简单且高效的方式,在 Deno 中也可以轻松实现。需要注意的是,在实现用户认证过程中,需要保护密钥的安全,同时需要对 Token 进行有效期的限制。
完整示例代码可以在以下位置找到:djwt_demo
希望这篇文章能够给大家带来一些帮助,让我们更好地使用 JWT 完成 Web 应用的开发。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65c5bfa7add4f0e0ff047dc4