Mongodb 如何使用令牌标识用户?
我有一个名为“test”的mongoDB Atlas数据库,我只处理后端 有两个系列:酱汁和用户。(是的,是关于酱汁的) 我需要确保只有在数据库中创建酱汁的用户才能删除此酱汁 在前端的delete请求中,我确实收到了两件东西:一个令牌(用jwt制作)和要删除的酱汁的id 通过酱汁的id,我可以找到创建酱汁的用户,这意味着我也可以在users集合中找到用户。对象用户有两个属性:email和password(用bcrypt散列) 所以我从前端获得了令牌(req.body.token)和产品的id(req.params.id) 这样:我就可以找到创建对象的用户的id 因此,我需要在令牌和用户ID之间建立一个链接 我尝试用jwt.sign检查userId的值,并将其与接收到的令牌进行比较。问题:这个令牌在每次连接时都会改变,所以这不是正确的方法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)和产品的
因此,我的问题是:从后端(我不能触摸前端)看,当我只有要删除的对象的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)
}
}
非常感谢,我要试试这个,我会告诉你它是否也解决了我的问题。