如何在Node.JS应用中使用JWT_KEY创建秘密字符串

时间:2020-03-08 10:28:19

标签: node.js mongodb api jwt

我正在开发一个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是否正确编写或错误?如果字符串是由库生成的或从其他地方获取的,则我不知道在我的应用程序中或在网络中从何处搜索它。

0 个答案:

没有答案