Mongodb 如何使用令牌标识用户?

Mongodb 如何使用令牌标识用户?,mongodb,api,jwt,token,backend,Mongodb,Api,Jwt,Token,Backend,我有一个名为“test”的mongoDB Atlas数据库,我只处理后端 有两个系列:酱汁和用户。(是的,是关于酱汁的) 我需要确保只有在数据库中创建酱汁的用户才能删除此酱汁 在前端的delete请求中,我确实收到了两件东西:一个令牌(用jwt制作)和要删除的酱汁的id 通过酱汁的id,我可以找到创建酱汁的用户,这意味着我也可以在users集合中找到用户。对象用户有两个属性:email和password(用bcrypt散列) 所以我从前端获得了令牌(req.body.token)和产品的

我有一个名为“test”的mongoDB Atlas数据库,我只处理后端

有两个系列:酱汁和用户。(是的,是关于酱汁的)

我需要确保只有在数据库中创建酱汁的用户才能删除此酱汁

在前端的delete请求中,我确实收到了两件东西:一个令牌(用jwt制作)和要删除的酱汁的id

通过酱汁的id,我可以找到创建酱汁的用户,这意味着我也可以在users集合中找到用户。对象用户有两个属性:email和password(用bcrypt散列)

所以我从前端获得了令牌(req.body.token)和产品的id(req.params.id)

这样:我就可以找到创建对象的用户的id

因此,我需要在令牌和用户ID之间建立一个链接

我尝试用jwt.sign检查userId的值,并将其与接收到的令牌进行比较。问题:这个令牌在每次连接时都会改变,所以这不是正确的方法


因此,我的问题是:从后端(我不能触摸前端)看,当我只有要删除的对象的id和令牌时,我应该如何识别用户?

我建议您使用Auth中间件功能。在这个函数中,您从mongoDB检索用户数据(通过令牌搜索),并将用户传递给您的请求对象

这样,您将始终在所有经过身份验证的路由中拥有当前用户对象

首先更改身份验证中间件,如下所示:

const auth = async (req, res, next) => {
    try {
        // Try to find user
        const token = req.header('Authorization').replace('Bearer ', '')
        const decoded = jwt.verify(token, 'thejwtsecret')
        const user = await User.findOne({ _id: decoded._id, 'tokens.token': token }) 

        // If user not found, throw error
        if (!user) {
            throw new Error()
        }

        // Else, add user data and toke into request object
        req.token = token
        req.user = user
        
        // Keep going
        next()
    } catch (e) {
        // User not authenticated
        res.status(401).send({ error: 'Please authenticate.' })
    }
}
module.exports = auth
您说过您有一个Sauces集合和一个delete路由,有了这个新的中间件,用户数据将很容易在请求对象中访问:

router.delete('/sauces', auth, async (req, res) => {
    // req.user is your current user object 
    // req.token is the token of the current user
});

基于mongodb的身份验证中间件

exports.verifyToken = async (req, res, next) => {


let token = req.body.token


if (token) {
jwt.verify(token, secret, async (err, decoded) => {
  if (err) {
    return res.status(400).send({
      success: false,
      message: 'Failed to authenticate token.'
    }).status(401)
  } else {
    const User = await dbSchema.User.findOne({ _id: decoded._id }).exec();
    if (User ) {
      req.body.decoded = decoded._id
      return next()
    }
    else {
      return res.status(400).send({
        success: false,
        message: 'Token Expired.'
      }).status(401)
    }
  }
})


 }



else {
return res.status(400).send({
  success: false,
  message: 'Token Required.'
}).status(401)


}
}

非常感谢,我要试试这个,我会告诉你它是否也解决了我的问题。