📜  自定义 api 端点 jwt 令牌 - TypeScript (1)

📅  最后修改于: 2023-12-03 15:41:24.163000             🧑  作者: Mango

自定义 API 端点 JWT 令牌 - TypeScript

在开发 web 应用过程中,我们通常需要验证用户身份,以便在保护资源和数据的同时,为用户提供个性化的服务。JWT(JSON Web Tokens)是一种流行的身份验证机制,它是一种安全的、开放标准的 JSON 格式的令牌,由三部分组成:头部、载荷和签名,可以在网络间可靠传输,有效地保证了身份验证的安全性。

在 TypeScript 中,我们可以使用 Express 库和 JWT 库来实现自定义 API 端点的 JWT 令牌。以下是详细步骤:

安装依赖

在开始之前,我们需要先安装 Express 和 jsonwebtoken 两个库,可以使用 npm 安装:

npm install express jsonwebtoken
编写代码
导入依赖

在 TypeScript 中,我们需要先导入需要的库和类型。在本例中,我们需要导入 Express 库和 jsonwebtoken 库。同时,为了方便演示,我们还需要导入该项目中的 User 类型和 users 数组。

import express, { Request, Response } from "express";
import jwt from "jsonwebtoken";

type User = {
  id: number;
  name: string;
  password: string;
};

const users: User[] = [
  { id: 1, name: "Alice", password: "password1" },
  { id: 2, name: "Bob", password: "password2" },
];
编写身份验证函数

我们需要编写一个身份验证函数,用于验证用户提供的用户名和密码是否匹配。该函数将返回一个 boolean 值,表示用户是否通过验证。

function authenticateUser(name: string, password: string): boolean {
  return users.some(
    (user) => user.name === name && user.password === password
  );
}
定义 JWT 密钥

在应用中,我们需要定义一个全局的 JWT 密钥,用于签发和验证 JWT 令牌。我们可以将该密钥定义为一个环境变量,或者在代码中直接硬编码。

const jwtSecret = "secret";
编写登录 API 端点

我们需要编写一个登录 API 端点,该端点将接收用户提供的用户名和密码,然后返回一个 JWT 令牌,表示用户已经通过验证。在该端点中,我们需要调用身份验证函数,如果用户通过验证,则生成 JWT 令牌并返回。

const app = express();

app.post("/login", (req: Request, res: Response) => {
  const name = req.body.name;
  const password = req.body.password;

  if (authenticateUser(name, password)) {
    const token = jwt.sign({ name }, jwtSecret);
    res.send({ token });
  } else {
    res.status(401).send({ message: "Invalid credentials" });
  }
});
编写受保护的 API 端点

我们还需要编写一个受保护的 API 端点,该端点将仅允许已通过身份验证的用户访问。在该端点中,我们需要验证 JWT 令牌的有效性,如果令牌有效,则返回该用户的一些数据。

app.get("/user", (req: Request, res: Response) => {
  const token = req.headers["authorization"];
  if (!token) {
    return res.status(401).send({ message: "Missing authorization header" });
  }

  try {
    const decoded = jwt.verify(token, jwtSecret) as { name: string };
    const user = users.find((user) => user.name === decoded.name);
    if (!user) {
      return res.status(401).send({ message: "Invalid token" });
    }

    res.send({ user });
  } catch (error) {
    res.status(401).send({ message: "Invalid token" });
  }
});
总结

在本文中,我们介绍了如何在 TypeScript 中实现自定义 API 端点 JWT 令牌的身份验证机制。首先,我们需要安装 Express 和 jsonwebtoken 两个库,并导入需要的类型和数据。其次,我们需要编写身份验证函数,用于验证用户名和密码。接着,我们需要定义全局 JWT 密钥,用于签发和验证 JWT 令牌。最后,我们需要编写登录和受保护的 API 端点,分别用于生成 JWT 令牌和验证 JWT 令牌。通过上述步骤,我们可以有效地实现一个安全、可靠的身份验证机制。