如何通过传入JWT Token查询对应的论坛或节点
解决实现方案
核心问题说明
你当前的查询接口依赖前端传递createdBy参数,既无法实现仅通过JWT查询自有论坛的需求,也存在越权风险。正确逻辑是直接从JWT校验后挂载到请求对象的用户信息中,获取用户ID作为查询条件。
具体修改步骤
1. 确认JWT生成时的Payload字段
首先要保证你生成JWT签名时,Payload中确实存入了和Forum模型createdBy关联的用户ID字段,示例生成逻辑参考:
// 登录成功后生成token的逻辑 const token = jwt.sign( { userID: user._id }, // 此处user._id就是用户表的主键,和Forum的createdBy关联 process.env.JWT_KEY, { expiresIn: '24h' } );
注意:如果你的Payload中用户ID的字段名不是
userID,后续代码要同步修改为对应字段名。
2. 修改查询接口逻辑
将原来从请求体取createdBy的逻辑,改为从JWT解析后的req.user中取用户ID:
exports.getByOwnerID = function (req, res, next) { // 直接从JWT解析结果拿用户ID,不需要前端传递 Forum.find({createdBy: req.user.userID}) .then(doc => { // 原判断逻辑有误:find永远返回数组,空数组判断![]为false,永远不会触发400 if(doc.length === 0) { return res.status(404).json({message: "未找到您创建的论坛"});} return res.status(200).json(doc); }) .catch(err => next(err)); }
3. 修正路由匹配规则
保证路由路径和你实际请求路径匹配,同时更符合REST规范改用GET请求(不需要传请求体):
// 假设你的forum路由模块已经挂载在/forum前缀下 router.get('/getOwner', verifyToken, getByOwnerID);
4. 调整请求方式
修改后的请求示例:
GET http://localhost:8080/forum/getOwner 请求头携带:Authorization: Bearer {token}
额外注意事项
- 如果JWT Payload中存储的用户ID字段是
_id,将代码中req.user.userID改为req.user._id即可 - Mongoose会自动把JWT解析出来的字符串类型用户ID,转换为
ObjectId类型和createdBy字段匹配,不需要额外做类型转换
内容的提问来源于stack exchange,提问作者Deezer
相关产品推荐
相关产品推荐

