Skip to content
📈0️⃣

Token 介绍

封装登录/注册功能之前,我们先介绍下 Token,以及它的作用。

下面介绍 koa2 怎么生成 token 的。

1. 什么是 Token

Token 的作用主要有以下几点:

  1. 身份验证:Token 可以用于验证用户的身份,确认用户是否有权限访问某些受保护的资源。
  2. 信息交换:可以在 Token 中携带用户相关的信息,如用户 ID、角色等,方便在不同服务之间传递和使用。
  3. 防止 CSRF 攻击:Token 可以防止跨站请求伪造(Cross-Site Request Forgery),通过验证 Token 可确保请求是合法的。
  4. 状态管理:Token 可以用于存储用户的登录状态,避免在服务器端保存会话状态。

需要注意的是,生成 Token 时应当谨慎处理密钥(secret key)的安全性,同时也应注意 Token 的有效期、刷新和撤销机制。

2. 怎么生成 Token

在 Koa2 中生成 Token 可以使用 jsonwebtoken 库来实现。jsonwebtoken 是一个流行的用于生成和验证 JSON Web Tokens(JWT)的库。JWT 是一种用于在用户和服务器之间安全传输信息的标准方法。Token 通常用于身份验证和授权目的。

以下是一个简单的示例,演示如何在 Koa2 中生成 Token 并将其发送给客户端:

首先,确保安装 jsonwebtoken 库:

bash
npm install jsonwebtoken

然后,你可以按照以下步骤在 Koa2 中生成 Token:

javascript
const Koa = require("koa");
const jwt = require("jsonwebtoken");

const app = new Koa();

app.use(async (ctx, next) => {
  // 模拟用户登录验证成功
  const user = {
    id: 1,
    username: "exampleUser",
  };

  // 生成token
  const token = jwt.sign({ user }, "yourSecretKey", { expiresIn: "1h" });

  // 将token发送给客户端
  ctx.body = { token };

  await next();
});

app.listen(3000, () => {
  console.log("Server is running on port 3000");
});

在这个示例中,当请求到达生成 Token 的路由时,会生成一个包含用户信息的 payload,并使用 jwt.sign()方法对 payload 进行签名,生成 Token。最后将 Token 发送给客户端。

2.1. jwt.sign 语法

语法 jwt.sign(payload, secretOrPrivateKey, [options, callback])

通过 JSON Web Token(JWT)库来生成一个 token。下面是jwt.sign的解释:

  1. jwt.sign({ user }, 'yourSecretKey', { expiresIn: '1h' }) 是一个使用 JWT 签发 token 的函数调用。具体含义如下:

    • { user }:表示要存储在 token 中的信息。通常情况下,会将用户相关的信息存储在 token 中,这里直接使用了一个包含用户信息的对象 { user }
    • 'yourSecretKey':这个参数是用于签名 token 的密钥(Secret Key)。在使用 JWT 进行签发和验证 token 时,需要使用相同的密钥来保证 token 的安全性。
    • { expiresIn: '1h' }:表示 token 的过期时间为 1 小时。在这种情况下,生成的 token 将在签发后的 1 小时内有效,之后将过期并不再被验证通过。
  2. yourSecretKey 是一个字符串,作为对生成的 token 进行签名时所用的密钥。密钥的选择应该是一个足够复杂和难以猜测的字符串,以确保生成的 token 不会被篡改或伪造。

TIP

为了获取 Secret Key(密钥),你可以遵循以下最佳实践:

  • 保密性:不要将密钥硬编码在代码中,而是将其存储在安全的地方,如环境变量、配置文件或密钥管理服务中。
  • 强度:密钥应该足够长,并具有足够的复杂性,推荐使用专门的密码生成工具生成随机的强密码。

建议将密钥存储在环境变量中,然后从环境变量加载密钥以供应用程序使用。这样可以确保密钥不会被泄露到代码库或日志中。

总之,密钥的保密性和强度至关重要,它们对 token 的安全性至关重要。在选择和存储密钥时,请牢记这些最佳实践,以确保应用程序的安全性。

2.2. 验证 Token

要验证 yourSecretKey,可以使用 JWT 库的 verify() 方法。该方法需要传入三个参数:JWT 字符串、密钥和回调函数。在回调函数中,可以处理验证结果。

示例代码如下:

javascript
jwt.verify(token, "yourSecretKey", (err, decoded) => {
  if (err) {
    console.log("Token is invalid");
  } else {
    console.log("Token is valid");
    console.log(decoded); // 解码后的 JWT 数据
  }
});

在上面的代码中,token 是待验证的 JWT 字符串,yourSecretKey 是用于解密 JWT 的密钥。如果验证失败,err 对象会包含错误信息;如果验证成功,decoded 对象会包含解码后的 JWT 数据。