我正在开发一个Node.JS&MongoDB应用程序,其中插入了文章和类别,并具有注册和登录用户系统。我需要添加/修复一个秘密字符串,以使Jsonwebtoken(JWT_KEY)正常工作。
当我尝试添加带有详细信息(标题,附带的图片等)的文章时,我的身份验证或授权失败,并投给了Postman,这可能是因为我在安装或使用 jsonwebtoken 库时出错。可能是应该隐藏在最后的nodemon.json文件中的一个错误(用户,密码, JWT_KEY),但是可能在我的代码的另一部分中。
Postman进程与 article.js路由文件连接,这似乎很好。相关的部分是createArticle POST,因为到目前为止其余的工作都很好:
const express = require('express');
const router = express.Router();
const upload = require('../middlewares/upload');
const checkAuth = require('../middlewares/checkAuth');
const {
getAllArticles,
createArticle,
getArticle,
updateArticle,
deleteArticle
} = require('../controllers/articles');
router.get('/', getAllArticles);
router.get('/:articleId', getArticle);
router.post('/', checkAuth, upload.single('image'), createArticle);
router.patch('/:articleId', checkAuth, updateArticle);
router.delete('/:articleId', checkAuth, deleteArticle);
module.exports = router;
这是负责授权过程的 authChek.js中间件:
const jwt = require('jsonwebtoken');
const checkAuth = (req, res, next) => {
try {
const token = req.headers.authorization.split('')[1];
jwt.verify(token, process.env.JWT_KEY);
next();
} catch(error) {
res.status(401).json({
message: 'Auth failed'
})
}
}
module.exports = checkAuth;
验证似乎没问题,并且应该可以正常连接到nodemon。如果一切正常,邮递员应返回一条消息,说明授权已成功-但它返回的身份验证失败。在这里,在 article.js控制器中,POST方法似乎很好,并且不应捕获500、401或409错误:
const mongoose = require('mongoose');
const Article = require('../models/article');
const Category = require('../models/category');
module.exports = {
createArticle: (req, res) => {
const { path: image } = req.file;
const { title, description, content, categoryId } = req.body;
Category.findById(categoryId).then((category) => {
if (!category) {
return res.status(404).json({
message: 'Category not found'
})
}
const article = new Article({
_id: new mongoose.Types.ObjectId(),
title,
description,
content,
categoryId,
image: image.replace('\\','/')
});
return article.save();
}).then(() => {
res.status(200).json({
message: 'Created article'
})
}).catch(error => {
res.status(500).json({
error
})
});
}
}
使用JWT_KEY的另一个文件是登录部分中的 users.js控制器。查看if&结果的区域。它可能无法正确连接到nodemon.json文件的.env部分。参见“ process.env.JWT_KEY”:
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const User = require('../models/user');
module.exports = {
login: (req, res) => {
const { email, password } = req.body;
User.find({ email }).then((users) => {
if (users.length === 0) {
return res.status(401).json ({
message: 'Authentication failed'
});
}
const [ user ] = users;
bcrypt.compare(password, user.password, (error, result) => {
if (error) {
return res.status(401).json({
message: 'Authentication failed'
});
}
if (result) {
const token = jwt.sign({
id: user._id,
email: user.email,
},
process.env.JWT_KEY,
{
expiresIn: "1H"
});
return res.status(200).json({
message: 'Authentication successful',
token
})
}
res.status(401).json({
message: 'Authentication failed'
});
})
})
}
}
这里有什么要解决的吗?或者如何检查nodemon.json中的JWT_KEY是否正确编写或错误?如果字符串是由库生成的或从其他地方获取的,则我不知道在我的应用程序中或在网络中从何处搜索它。