Deno 中如何使用 jwt 进行用户认证?

在 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();

如果认证成功,服务端会返回用户信息,否则会返回错误信息。在服务端中实现用户认证的过程可以分为以下几步:

  1. 获取 Token,检查 Token 是否存在

  2. 解码 Token,获取 Payload 中的用户信息

  3. 对用户信息进行验证,判断用户是否合法

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