如何在 Deno 中使用 JWT 进行权限控制?

前言

随着前端技术的不断发展,前端工程师们开始承担越来越多的后端工作。在这个过程中,权限控制是一个非常重要的问题。JSON Web Token(JWT)是一种非常流行的身份验证和授权方式,它可以帮助我们实现基于 token 的权限控制。本文将介绍如何在 Deno 中使用 JWT 进行权限控制。

JWT 简介

JWT 是一种开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。JWT 可以用于认证、授权,甚至可以用于在不同的系统之间交换信息。

JWT 由三部分组成:头部、载荷和签名。头部包含了加密算法和类型等信息,载荷包含了需要传输的信息,签名则是用于验证数据完整性的。

在 Deno 中使用 JWT

在 Deno 中使用 JWT 需要先安装一个第三方模块,可以使用 deno.land/x/djwt,使用如下命令安装:

安装完成后,可以使用如下代码生成 JWT:

import { makeJwt, setExpiration, Jose, Payload } from "https://deno.land/x/djwt/mod.ts";

const key = "your-secret-key";
const payload: Payload = {
  iss: "your-issuer",
  exp: setExpiration(new Date().getTime() + 60000),
};

const header: Jose = {
  alg: "HS256",
  typ: "JWT",
};

const jwt = await makeJwt({ header, payload, key });
console.log(jwt);

其中,key 是用于签名的密钥,payload 是需要传输的信息,header 是 JWT 头部信息。makeJwt 函数会返回生成的 JWT。

接下来,可以使用如下代码验证 JWT:

import { validateJwt } from "https://deno.land/x/djwt/mod.ts";

const key = "your-secret-key";
const jwt = "your-jwt";

const validation = await validateJwt({ jwt, key });
console.log(validation);

其中,jwt 是需要验证的 JWT,key 是用于签名的密钥。validateJwt 函数会返回验证结果。

实现权限控制

使用 JWT 实现权限控制需要在服务端进行。当用户登录成功后,服务端可以生成一个 JWT 并将其返回给客户端。客户端在后续的请求中需要携带该 JWT,服务端可以验证 JWT 来判断用户是否有权限访问该请求。

下面是一个示例代码,用于实现基于 JWT 的权限控制:

import { makeJwt, setExpiration, Jose, Payload, validateJwt } from "https://deno.land/x/djwt/mod.ts";
import { Context } from "https://deno.land/x/oak/mod.ts";

const key = "your-secret-key";

const header: Jose = {
  alg: "HS256",
  typ: "JWT",
};

interface User {
  id: number;
  username: string;
  password: string;
}

const users: User[] = [
  { id: 1, username: "admin", password: "admin" },
  { id: 2, username: "user", password: "user" },
];

export const login = async (ctx: Context) => {
  const { value } = await ctx.request.body();
  const { username, password } = value;

  const user = users.find((u) => u.username === username && u.password === password);

  if (!user) {
    ctx.response.status = 401;
    ctx.response.body = { message: "Invalid username or password" };
    return;
  }

  const payload: Payload = {
    iss: "your-issuer",
    sub: user.id,
    exp: setExpiration(new Date().getTime() + 60000),
  };

  const jwt = await makeJwt({ header, payload, key });
  ctx.response.body = { jwt };
};

export const auth = async (ctx: Context, next: () => Promise<void>) => {
  const jwt = ctx.request.headers.get("Authorization")?.split(" ")[1];

  if (!jwt) {
    ctx.response.status = 401;
    ctx.response.body = { message: "No token provided" };
    return;
  }

  try {
    const validation = await validateJwt({ jwt, key });
    ctx.state.user = { id: validation.payload.sub };
    await next();
  } catch (err) {
    ctx.response.status = 401;
    ctx.response.body = { message: "Invalid token" };
  }
};

export const profile = async (ctx: Context) => {
  const user = users.find((u) => u.id === ctx.state.user.id);
  ctx.response.body = { id: user.id, username: user.username };
};

其中,login 函数用于用户登录,如果登录成功,则生成一个 JWT 并将其返回给客户端。auth 函数用于验证 JWT,如果验证成功,则将用户信息存储到 ctx.state.user 中,供后续的请求使用。profile 函数用于获取用户信息,如果用户已经登录,则返回用户信息,否则返回未授权的错误信息。

总结

本文介绍了如何在 Deno 中使用 JWT 进行权限控制,包括生成 JWT、验证 JWT 和实现基于 JWT 的权限控制。JWT 是一种非常流行的身份验证和授权方式,它可以帮助我们实现基于 token 的权限控制。希望本文对您有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65bdd32eadd4f0e0ff771331