我在youtube上使用lama-dev尝试了这段代码。我在邮递员那里收到了这个错误我复制访问令牌,当我使用它时,它会显示(令牌无效(,但与用户和视频是相同的令牌。
当我在终端中查看时,它显示(无法读取未定义的属性id(或无法读取未确定的属性isAdmin(
如果问题出在代码上,或者我不知道如何使用poster,我不知道该如何解决。我是代码的新手
这是名为verifytoken.js的路由文件
const jwt = require("jsonwebtoken")
const verifyToken = (req,res, next) => {
const authHeader = req.headers.token
if(authHeader) {
const token = authHeader.split(" ")[1];
jwt.verify(token, process.env.JWT_SEC, (err, user)=>{
if(err) res.status(403).json("token is not valid");
req.user = user;
next();
})
} else {
return res.status(401).json(" you are not authenticated");
}
};
const verifyTokenAndAuthorization = (req,res,next) => {
verifyToken(req,res,()=> {
if(req.user.id === req.params.id || req.user.isAdmin ) {
next();
} else {
res.status(403).json("you are not allowed to do that");
}
});
};
const verifyTokenAndAdmin = (req,res,next) => {
verifyToken(req,res,()=> {
if( req.user.isAdmin) {
next();
} else {
res.status(403).json("your are not the admin ");
}
});
};
module.exports = {verifyToken, verifyTokenAndAuthorization, verifyTokenAndAdmin};
- 这是名为user.js的路由文件*
const User = require("../models/User")
const { verifyToken, verifyTokenAndAuthorization, verifyTokenAndAdmin} = require("./verifyToken");
const router = require("express").Router();
// UPDATE
router.put("/:id", verifyTokenAndAuthorization, async (req, res)=>{
if(req.body.password) {
req.body.password = CryptoJS.AES.encrypt(
req.body.password,
process.env.PASS_SEC
).toString();
}
try {
const updatedUser = await User.findByIdAndUpdate(req.params.id, {
$set: req.body
}, {new: true}
);
res.status(200).json(updatedUser);
}catch (err) {
res.status(500).json(err);
}
});
//DELETE
router.delete("/:id", verifyTokenAndAuthorization, async (req,res)=>{
try {
await User.findByIdAndDelete(req.params.id)
res.status(200).json("user has been deleted");
}catch(err){
res.status(500).json(err)
}
})
//GET USER
router.get("/find/:id", verifyTokenAndAdmin, async (req,res)=>{
try {
const user = await User.findById(req.params.id);
const { password, ...others } = user._doc;
res.status(200).json(others);
}catch(err){
res.status(500).json(err)
}
})
module.exports = router;
我认为这部分有一个问题:
if(authHeader) {
const token = authHeader.split(" ")[1];
jwt.verify(token, process.env.JWT_SEC, (err, user)=>{
if(err) res.status(403).json("token is not valid");
req.user = user;
next();
})
} else {
return res.status(401).json(" you are not authenticated");
}
此行:if(err) res.status(403).json("token is not valid");
您将状态设置为403,但继续执行代码。因此,即使您的令牌无效,您仍然可以调用next
回调并尝试读取req.user
。所以我的猜测是你的代币出了问题。出现错误时应立即返回:if(err) return res.status(403).json("token is not valid");
此外,split(" ")
看起来有点可疑。为什么有这么多空间?你确定这样可以吗?
我遇到了同样的问题,使用if-else语句可以解决这个问题
express doc示例如下所示。
if(err) {
res.status(403).json('Token is not valid');
} else {
req.user = user;
next();
}
我想这可能是由next((函数引起的,但我已经查看了文档,却找不到原因
如果不起作用,请尝试终止节点进程
在auth.js文件中,更改:
user && res.status(401).json("Wrong Credentials!");
收件人:
if (!user) {
res.status(401).json("Wrong Credentials!");
return;
}
请在顶部插入以下行;
const CryptoJS = require("crypto-js");