node.js - 验证不同类型用户的身份验证 token 的最佳方法是什么?

标签 node.js express jwt

假设我有 10 条路线,每条路线仅可供特定类型的用户访问。当用户登录时,会生成一个 token 。这些用户 token 是使用其 _id 和存储在 .env 文件中的 token secret 生成的。

通常,每种用户类型的 token 验证是使用单独的函数完成的,因为不同类型的用户具有不同的 token secret 。例如,用户 1 的 token secret 可能为 TOKEN_SECRET_USER2 = 6ygfewf6hj,用户 2 的 token 可能为 TOKEN_SECRET_USER1 = 87uhjkaf89

当向某个路由发出任何请求时,系统会验证用户 token 以查看用户是否可以访问该路由。

这里有两个可供不同用户类型访问的示例路由,

// Route accessible to user type 1
router.get("/foo", verifyTokenUSER1, async (req, res) => {
    // All the good stuff
});

// Route accessible to user type 2
router.post("/bar", verifyTokenUSER2, async (req, res) => {
    // All the good stuff
});

这是验证模块的一些方法,

// Verification for user 1
const verifyTokenUSER1 = (req, res, next) => {

    const token = req.header("auth-token");
    if (!token) return res.status(401).send();

    try {
        jwt.verify(token, process.env.TOKEN_SECRET_USER1);

        next();
    } catch (err) {
        res.status(401).send();
    }
};

// Verification for user 2
const verifyTokenUSER2 = (req, res, next) => {

    const token = req.header("auth-token");
    if (!token) return res.status(401).send();

    try {
        jwt.verify(token, process.env.TOKEN_SECRET_USER2);

        next();
    } catch (err) {
        res.status(401).send();
    }
};

如您所见,上述方法只有一处变化,即用户类型的访问 token key 。

如果可能的话,我想使用 1(一个)单个函数来验证它们。但我无法将任何值作为参数传递给验证方法。那么,如何删除这里的重复项呢?

最佳答案

如果您使用 bind ( mdn ),您实际上可以将参数传递给 verify 方法:

// Route accessible to user type 1
router.get("/foo", verifyToken.bind(null, process.env.TOKEN_SECRET_USER1), async (req, res) => {
    // All the good stuff
});

// Route accessible to user type 2
router.post("/bar", verifyToken.bind(null, process.env.TOKEN_SECRET_USER2), async (req, res) => {
    // All the good stuff
});

此处函数的 bind 方法接收 2 个参数:第一个是函数的 this 上下文,第二个是第一个参数。它返回一个新函数,该函数将接收提供的 token 作为第一个参数,并将接收 req, res, next 作为下一个参数。

const verifyToken = (tokenSecret, req, res, next) => {

    const token = req.header("auth-token");
    if (!token) return res.status(401).send();

    try {
        jwt.verify(token, tokenSecret);

        next();
    } catch (err) {
        res.status(401).send();
    }
};

另一种等效的方法是构建一个验证方法“工厂”,它返回一个在 token 上具有闭包( mdn )的验证函数:


// Route accessible to user type 1
router.get("/foo", getTokenVerifier(process.env.TOKEN_SECRET_USER1), async (req, res) => {
    // All the good stuff
});

// Route accessible to user type 2
router.post("/bar", getTokenVerifier(process.env.TOKEN_SECRET_USER2), async (req, res) => {
    // All the good stuff
});

// this function returns a new function, with a closure on the provided tokenSecret
const getTokenVerifier = (tokenSecret) => {
  return (req, res, next) => {
    const token = req.header("auth-token");
    if (!token) return res.status(401).send();

    try {
        jwt.verify(token, tokenSecret);

        next();
    } catch (err) {
        res.status(401).send();
    }
  }

}

关于node.js - 验证不同类型用户的身份验证 token 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65830497/

相关文章:

javascript - 使用 axios 获取本地 JSON 数据时遇到问题

javascript - 为什么修改 array.slice() 也会改变原始数组?

javascript - Node : removing duplicate objects from array

javascript - SSE 服务器在几次尝试后停止响应

node.js - Express 未知错误处理程序正在记录自定义错误

javascript - 如何在cheerio中获取div的 child

node.js - http请求中的 header 和正文数据为空

angularjs - 对于从 API 提取的 AngularJS 安全站点,我应该使用什么 oAuth2 Grant

security - JSON Web token 过期

python - 哪个 Python JOSE 库支持嵌套 JWT(签名+加密)?