返回

Node 入门项目:利用 Koa2 构建一个简单的 JWT 认证系统

前端

什么是 JWT

JWT 全称为 JSON Web Token,是一种用于在网络上安全地传输信息的小型、自包含的 JSON 对象。JWT 通常用于在两个系统之间传递用户身份信息,例如客户端和服务器。

为什么使用 JWT

JWT 是一种流行的认证方式,因为它具有以下优点:

  • 紧凑性: JWT 是非常紧凑的,可以轻松地在网络上传输。
  • 安全性: JWT 是安全的,因为它是使用数字签名算法(例如 HMAC SHA256)进行签名的。
  • 无状态: JWT 是无状态的,这意味着服务器不需要存储任何用户会话信息。

使用 Koa2 实现 JWT 认证

现在我们了解了 JWT 是什么,以及为什么使用它,让我们来看看如何使用 Koa2 实现 JWT 认证。

安装依赖

首先,我们需要安装 Koa2 和 jsonwebtoken 包:

npm install koa2 jsonwebtoken

创建 JWT 签名密钥

接下来,我们需要创建一个 JWT 签名密钥。这个密钥将用于对 JWT 进行签名和验证。

const secret = 'YOUR_SECRET_KEY';

编写 JWT 中间件

现在我们可以编写 JWT 中间件了。这个中间件将验证传入请求的 JWT,并将其添加到请求的上下文对象中。

const jwt = require('jsonwebtoken');

const authMiddleware = async (ctx, next) => {
  const token = ctx.request.headers['authorization'];

  if (!token) {
    ctx.status = 401;
    ctx.body = {
      message: 'Unauthorized',
    };
    return;
  }

  try {
    const decoded = jwt.verify(token, secret);

    ctx.state.user = decoded;

    await next();
  } catch (err) {
    ctx.status = 401;
    ctx.body = {
      message: 'Unauthorized',
    };
  }
};

使用 JWT 中间件

现在我们可以使用 JWT 中间件了。我们将把它添加到我们的 Koa2 应用的路由中。

const app = new Koa2();

app.use(authMiddleware);

app.get('/protected', async (ctx) => {
  ctx.body = {
    message: 'Protected resource',
  };
});

app.listen(3000);

生成 JWT

最后,我们需要编写一个端点来生成 JWT。这个端点将接收用户名和密码,并返回一个 JWT。

app.post('/login', async (ctx) => {
  const { username, password } = ctx.request.body;

  if (username === 'admin' && password === 'password') {
    const token = jwt.sign({ username }, secret, { expiresIn: '1h' });

    ctx.body = {
      token,
    };
  } else {
    ctx.status = 401;
    ctx.body = {
      message: 'Unauthorized',
    };
  }
});

结论

现在我们已经构建了一个使用 Koa2 的简单 JWT 认证系统。我们可以使用这个系统来保护我们的 API 端点,并确保只有经过授权的用户才能访问它们。