假设我有 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/