【问题标题】:Why do we use connect-mongo with express-session, passport, and express?为什么我们将 connect-mongo 与 express-session、passport 和 express 一起使用?
【发布时间】:2021-12-10 20:32:49
【问题描述】:

我还是 Passport 的新手,我已经创建了一个包含 express、passport 和 express-session 的应用程序,并且它正在按预期进行身份验证。但由于某种原因,我在每个教程中都会遇到 connect-mongo。所以请您能准确解释一下 connect-mongo 的作用和/或如果您能提供一些关于它的好文档,那就太好了。感谢您抽出宝贵的时间,先生。

【问题讨论】:

    标签: node.js express mongoose passport.js express-session


    【解决方案1】:

    @ArabDROPS首先,你是否使用了错误的包来连接我们的节点应用程序和mongo数据库使用Mongoose Package连接我们的应用程序和数据库

    在现代 Web 应用程序中,JWTs 被广泛使用,因为它比会话 cookie 更好地扩展

    用户登录生成token的时候可以按照这个模板进行,不需要使用express-session可以通过中间件进行检查。


    1.用户登录时生成 JWT 令牌

    生成令牌并将此令牌与响应一起发送...

        router.post("/login", async (req, res) => {
          try {
            // checking username
            const user = await User.findOne({ email: req.body.email });
            !user && res.status(401).json("Wrong Username");
        
            // checking password
            const bytes = CryptoJS.AES.decrypt(user.password, process.env.SECRET_KEY);
            const originalPassword = bytes.toString(CryptoJS.enc.Utf8);
        
            // If password not match return respond
            originalPassword !== req.body.password &&
              res.status(401).json("Wrong Password");
        
            // Creating Json Web Token
        
            const accessToken = jwt.sign(
              { id: user._id, isAdmin: user.isAdmin },
              process.env.SECRET_KEY,
              { expiresIn: "5d" }
            );
        
            // stop sending password to respond
            const { password, ...info } = user._doc;
        
            // Returning User(info) , also sending accessToken
            res.status(200).json({ ...info, accessToken });
          } catch (err) {
            res.status(500).json(err);
          }
        });
    

    2。验证令牌中间件

    创建此验证令牌函数,用作路由中的 MIDDLEWARE...

    const jwt = require("jsonwebtoken");
    
    function verify(req, res, next) {
      const authHeader = req.headers.token;
      if (authHeader) {
        const token = authHeader.split(" ")[1];
        jwt.verify(token, process.env.SECRET_KEY, (err, user) => {
          if (err) res.status(403).json("Token is not valid");
          req.user = user;
          next();
        });
      } else {
        return res.status(402).json("You are not authorized");
      }
    }
    
    module.exports = verify;
    

    3。将路由作为中间件进行验证

    const verify = require("../verifyToken");
    
    // CREATE
    router.post("/", verify, async (req, res) => {
      if (req.user.isAdmin) {
        const newList = new List(req.body);
        try {
          const savedList = await newList.save();
          res.status(201).json(savedList);
        } catch (error) {
          res.status(500).json(err);
        }
      } else {
        res.status(403).json("You are not allowed!");
      }
    });
    
    // DELETE
    router.delete("/:id", verify, async (req, res) => {
      if (req.user.isAdmin) {
        try {
          await List.findByIdAndDelete(req.params.id);
          res.status(201).json("The list has been deleted");
        } catch (err) {
          res.status(500).json(err);
        }
      } else {
        res.status(403).json("You are not allowed!");
      }
    });
    

    结论:-

    1. 在用户登录时使用 jwt.sign 创建令牌...
    2. 在根目录下创建验证函数导出此函数...
    3. 需要在路由文件中使用此函数作为中间件...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2020-04-08
      • 2019-08-27
      • 2021-10-20
      • 2022-10-02
      • 2019-11-04
      • 2015-11-22
      相关资源
      最近更新 更多