【问题标题】:How to find a Forum or a Node by passing a JWT Token?如何通过传递 JWT 令牌找到论坛或节点?
【发布时间】:2021-12-22 14:56:38
【问题描述】:

我想知道如何使用我的 JWT 令牌找到我的论坛

exports.getByOwnerID = function (req, res, next) {
  Forum.find({createdBy: req.body.createdBy})
  .then(doc => {
      if(!doc) { return res.status(400).end();}
      return res.status(200).json(doc);
  })
  .catch(err => next(err));
}

所以在这里我有我的功能来验证我的 JWT 令牌 比如我就是这样用的

这是我的路线: router.post('/',verifyToken,getOwner);

这是我的要求: 发布 http://localhost:8080/forum/getOwner 授权:不记名{token}

const extractToken = (rawTokenHeader) => {
  
  if(!rawTokenHeader) { return undefined; }

  // Remove bearer and extract token value
  const temp = rawTokenHeader.split(' ');
  if(!temp || temp.length != 2) { return undefined; }

  // Return encoded token
  return temp[1];

};

module.exports = function(req,res,next){
  // Get authorization header
  const rawTokenHeader = req.header('Authorization');

  // Get token value
  const token = extractToken(rawTokenHeader);

  // No token -> No access
  if(!token) {
    console.log('No token in request');
    // Access denied
    return res.status(401).send('Access Denied');
  }
  
  // Verify token
  try {
    const decoded = jwt.verify(token, process.env.JWT_KEY);

    req.token= decoded;
    req.user = decoded;
    //console.log(token.userID);
        // Proceed
    next();
  } catch(err) {
    console.error('Error in JWT check: ', err);
    // Tell client something went wrong
    res.status(400).send('Invalid Token');
  }
}
const forumSchema = ({
    forumName: {
        type: String,
        required: true,
    },
    forumDescription: {
        type: String,
        required: true,
    },
    createdBy: { 
        type: Schema.Types.ObjectId, ref: 'User' 
    },
    published_on: {
        type: String,
        default: moment().format("LLL")
    },
});

我已经尝试了很多东西,但我无法再解决它。我需要帮助

【问题讨论】:

  • 您的问题提到了 JWT,但代码中不包含任何与 JSON Web Token 相关的说明。你实现了 JWT 吗?它是否被传递到服务器?如果是这样,以什么形式 - cookie,标题?你有解码 JWT 的中间件吗?
  • 是的,等一下,我会把它放进去。

标签: javascript node.js mongodb express jwt


【解决方案1】:

我如何没有足够的声誉来发表评论我留下这个作为答案,如果我们不知道论坛的架构是什么样子以及返回的请求是什么,很难说为什么这不起作用。 body.createdBy,但如果 jwt 是由您创建的,您可以在其中对 Forum._id 进行编码,当您在此处收到它时,您可以对其进行解码并在数据库中找到论坛

编辑---

现在我可以看到您遇到的错误和论坛的架构,我可以说您可能可以通过导入 mongoose 并将其添加到查询 mongoose.Types.ObjectId(req.body.CreatedBy) 来解决错误,这会将字符串解析为 objectId

【讨论】:

  • 你能把它写成代码吗?我也可以添加论坛的架构
  • 我希望编辑工作@Deezer
【解决方案2】:

如您所见,req 对象中有user(或token)数据,我希望您的 jwt 令牌也包含用户的 id。您可以使用用户 ID 来查找他们的论坛。

根据路由器router.post('/', verifyToken, getOwner);getByOwnerID???),我们更新getOwner处理程序:

exports.getOwner = function (req, res, next) {
  Forum.find({ createdBy: req.user.userID }) // or something like that
  .then(doc => {
      if(!doc) { return res.status(400).end();}
      return res.status(200).json(doc);
  })
  .catch(err => next(err));
}

【讨论】:

  • 它包括用户 ID 是的,但在这里我找不到来自管理员的任何帖子.. 消息是:Cas to ObjectId failed for value "admin" (type string) at path "createdBy" for model "论坛”
猜你喜欢
  • 2022-01-17
  • 2014-04-19
  • 1970-01-01
  • 2021-12-06
  • 2019-01-18
  • 2020-01-31
  • 2019-07-09
  • 2019-09-21
  • 2020-09-03
相关资源
最近更新 更多