node.js - 功能认证中间件节点
问题描述
嘿,我对 js 和 node js 很陌生,我真的可以使用一些帮助。我有这个文件,我在其中导出处理令牌的中间件
const jwt = require("jsonwebtoken");
const config = require("../config/config");
module.exports = (req, res, next) => {
try {
let token = req.headers.authorization.split(" ")[1];
let decodeToken = jwt.verify(token, config.secrets.jwt);
let id = decodeToken.id;
let userType = decodeToken.userType;
if (req.body.id && req.body.id !== id) {
throw "Invalid user Id";
} else {
next();
}
} catch {
res.status(401).json({
error: new Error("Invalid request!"),
message: "Unauthorized"
});
}
};
我想要的是将它包装到一个函数中,该函数将有效负载(用户 ID 和用户类型)作为参数,这样我就可以从任何其他文件访问用户 ID 和用户类型。或者,如果有其他方法可以从这里导出用户 ID 和用户类型,以使其可见,以便我可以在控制器文件中使用它们,例如。谢谢 :)
解决方案
您将无法访问使用过的“从任何其他文件”。因为它user
是动态的,并且仅根据 HTTP 请求的上下文(您的快速中间件)进行解析。
所以你需要做的是添加user
到请求上下文并扩展请求对象(请求对象是上下文)。
module.exports = (req, res, next) => {
try {
let token = req.headers.authorization.split(" ")[1];
let decodeToken = jwt.verify(token, config.secrets.jwt);
let id = decodeToken.id;
let userType = decodeToken.userType;
if (req.body.id && req.body.id !== id) {
throw "Invalid user Id";
} else {
req.user = decodeToken; // or any object that describe the user
next();
}
} catch {
....
}
};
现在您可以访问控制器中的请求上下文并使用user
您认为合适的。
app.get('....', function(req, res){
console.log(req.user); // output { "id": XXX, userType: XXXX, ... }
const userId = req.user.id;
someService.someAction(userId, arg1, ....);
});
推荐阅读
- reactjs - 如何在 Azure DevOps 下拉组件中呈现额外的 JSX 内容
- airflow - 气流 - 没有命名模块微软提供者
- python - 获取 python 脚本构建结果作为 jenkins 参数
- parallel-processing - skopt BayesSearchCV 中的 n_points 是如何工作的?
- javascript - 如何复制两个下拉值并在另一个下拉列表中获取它们的选定值?
- java - 如何单击“继续”按钮以在 Selenium Java 中完成调查
- angular - 如何在角度 10 中使用 ng-select2 显示多列?
- java - 在类级别初始化属性将在加载或构造函数期间分配内存?
- python - X.__getitem__(1) 与类型(X).__getitem__(X, 1)
- sql-server - SQL Server PRINT 如何打印一个选择语句的结果?