# 在 Node 中使用 JWT

# 相关依赖

node 使用 JWT 可以使用两个现成的库

  • jsonwebtoken 用来生成 token 的
  • koa-jwt 用来验证 token 是否还合法(是否过期了,是否是伪造的)

# 示例代码

使用代码如下:

const Koa = require("koa");
const app = new Koa();
const router = require("koa-router")();

const jsonWebToken = require("jsonwebtoken");
const koaJWT = require("koa-jwt");

const secret = "asecretkey";

// jwt 校验报错拦截
app.use(async (ctx, next) => {
  await next().catch((err) => {
    if (err.status == "401") {
      ctx.status = 200; // 这个200是保证浏览器响应成功
      ctx.body = {
        msg: "Token认证失败",
        code: 500001,
        data: "",
      };
    } else {
      throw err;
    }
  });
});

// 这里解析 jwt 是否合法
app.use(
  koaJWT({ secret: secret }).unless({
    path: "/login",
  })
);

// 登录
router.post("/login", async (ctx) => {
  const { username, password } = ctx.request.body;

  if (!username || !password) {
    ctx.body = {
      msg: "用户名或密码不正确",
      code: "40001",
      data: "",
    };
    return;
  }

  const token = jsonWebToken.sign(
    { username, password },
    secret, // 密钥
    { expiresIn: 60 } // 过期时间 60s
  );

  ctx.body = {
    msg: "登录成功",
    code: 200,
    data: { userid: "12345678", token },
  };
});

// 验证 token
router.post("/login-test", async (ctx) => {
  ctx.body = "Login Test OK";
});

app.use(router.routes(), router.allowedMethods());

app.listen(3002, () => {
  console.log("koa run at 3002");
});

# 验证注意

  1. 使用 postman 验证效果即可
  2. 登录生成 token 没有什么注意点,post 请求,正常传参即可
  3. 验证 login-test 接口时需要注意,token 的认证需要在 header 中配置 token 信息,配置形式是 Bearer token值,不要忘了 Bearer 前缀。

# 当前依赖版本展示

{
  "jsonwebtoken": "^9.0.0",
  "koa": "^2.14.1",
  "koa-jwt": "^4.0.3",
  "koa-router": "^12.0.0"
}