Я занимаюсь разработкой приложения Node.JS & MongoDB для вставки статей и категорий, с системой регистрации и входа пользователей. Мне нужно добавить / исправить секретную строку, чтобы Jsonwebtoken (JWT_KEY) работал должным образом.
Моя аутентификация или авторизация не удалась, когда я пытаюсь добавить статью с деталями (заголовок, прикрепленное изображение и т. Д.). Возможно, из-за ошибки при установке или использовании библиотеки jsonwebtoken . Возможно, это ошибка в файле nodemon. json, который должен быть скрыт в конце (пользователь, пароль, JWT_KEY) , но, возможно, в другой части моего кода.
Процесс почтальона соединяется с article. js маршрутизирует файл , что, кажется, хорошо. Соответствующей частью является POST createArticle, так как остальные работают отлично:
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 middleware , который отвечает за процесс авторизации:
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. Если все в порядке, почтальон должен вернуть обратно сообщение, что авторизация прошла успешно, но он возвращает неудачную авторизацию. Здесь, в статье . js controller , метод 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 пользователи. js контроллер , в части входа в систему. Посмотрите на область if & result. Возможно, он не сможет правильно подключиться к части .env файла nodemon. json. Смотрите здесь "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'
});
})
})
}
}
Есть что-то, чтобы исправить здесь? Или как я могу проверить, правильно ли написан мой JWT_KEY в nodemon. json? Если строка генерируется библиотекой или берется откуда-то еще, я не знаю, где ее искать в моем приложении или в Интернете.