Express JWT认证机制

166 阅读1分钟
const express = require("express");
const app = express();
const port = process.env.PORT || 8080;
const jwt = require("jsonwebtoken");
const { expressjwt: ejwt } = require("express-jwt");
const secretKey = "mlkey"; // 任意密钥

// ====
// JWT
// jsonwebtoken 用于生成 JWT 字符串
// Express-jwt 用于将 JWT 字符串解析还原为 JSON 对象

app.use(
  ejwt({
    secret: secretKey,
    algorithms: ["HS256"], // 设置加密算法
    credentialsRequired: true, // 设置为 false 就不进行校验了,游客也可以访问
  }).unless({
    path: ["/login"], // 不需要校验的请求路径,可以设置多个
  })
);
// ====

app.post("/login", express.urlencoded({ extended: false }), (req, res) => {
  const userInfo = req.body;
  // 生成 JWT
  const token = jwt.sign({ username: userInfo.username }, secretKey, {
    // const token = jwt.sign({ username: "生成内容。。。" }, secretKey, {
    expiresIn: "30s", // 过期时间
  });
  res.send({
    code: 0,
    msg: "登录成功",
    token,
  });
});

// 获取用户信息,需要用户权限
app.get("/user", (req, res) => {
  res.send({
    code: 0,
    msg: "获取用户信息成功",
    data: req.auth,
  });
});

// 全局错误处理中间件
app.use((err, req, res, next) => {
  // 如果是 token 解析失败导致的错误
  if (err.name === "UnauthorizedError") {
    return res.status(401).send({
      code: -1,
      msg: "无效 Token",
    });
  }
  return res.status(500).send({
    code: -1,
    msg: "未知错误",
  });
});

app.listen(port, () => console.log(`Listening on port ${port}...`));

image.png 2.

image copy.png