Как создать секретную строку с помощью JWT_KEY в приложении Node.JS - PullRequest
0 голосов
/ 08 марта 2020

Я занимаюсь разработкой приложения 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? Если строка генерируется библиотекой или берется откуда-то еще, я не знаю, где ее искать в моем приложении или в Интернете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...