首页 > 解决方案 > MVC,passport.js并验证用户是否是authenticad然后重定向?

问题描述

你们好吗?

这次我被卡住了。

我正在研究 MVC 并尝试使用 passport.js 实现身份验证。一切都很顺利,直到意识到每个人,无论是否经过身份验证,只要他们知道 url 就可以访问我的路由。

搜索了一下,我在 Youtube 中找到了一个解决我问题的教程,但它不使用 MVC,我自己尝试过,但遇到了一个奇怪的问题:

当我尝试访问/dashboard,甚至登录时,我被重定向到/. 你们能告诉我我做错了什么吗?

教程是:https ://www.youtube.com/watch?v=SBvmnHTQIPY&t=1545s

提前致谢!

我的路线>login.js

const express = require('express');
const router = express.Router();
const loginController = require('../controllers/login');
const isLogged = require('../controllers/auth');


// @desc    Login/Landing page
// @route   GET /
router.get('/', isLogged.isLogged.ensureGuest, loginController.getLogin);

module.exports = router;

我的控制器>auth.js

const passport = require('passport');


exports.getAuthGoogle = passport.authenticate('google', { scope: ['profile'] });
exports.getAuthGoogleCallback = passport.authenticate('google', { failureRedirect: '/' });
exports.getAuthGoogleCallbackRedirect = (req, res, next) => { res.redirect('/dashboard') }

exports.getLogout = (req, res, next) => {
    req.logout();
    res.redirect('/')
}

exports.isLogged = {
    ensureAuth: (req, res, next) => {
        if (req.isAuthenticated()) {
            return next()
        } else {
            res.redirect('/')
        }
    },
    ensureGuest: (req, res, next) => {
        if (req.isAuthenticated()) {
            res.redirect('/')
        } else {
            return next()
        }
    }
}

我的路线>dashboard.js

const express = require('express');
const router = express.Router();
const dashboardController = require('../controllers/dashboard');
const isLogged = require('../controllers/auth');

// @desc    Dashboard
// @route   GET /dashboard
router.get('/', isLogged.isLogged.ensureAuth, dashboardController.getDashboard);

module.exports = router;

标签: javascriptnode.jsexpresspassport.js

解决方案


首先,为了减少 isLogged 冗余,我只是将这一行改为:

const { isLogged } = require('../controllers/auth');

在我的入口点(app.js),我已经在护照之前初始化了我的 Session 中间件。你应该这样做。

// Session middleware
app.use(session({
    secret: 'process.env.SESSION_SECRET',
    resave: false,
    saveUninitialized: false,
    store: new MongoStore({ mongooseConnection: mongoose.connection })
}))

// Passport middleware
app.use(passport.initialize());
app.use(passport.session());

还有,让我回到/auth.js 内部的愚蠢事情

exports.isLogged = {
    ensureAuth: (req, res, next) => {
        if (req.isAuthenticated()) {
            return next()
        } else {
            res.redirect('/')
        }
    },
    ensureGuest: (req, res, next) => {
        if (req.isAuthenticated()) {
            res.redirect('/dashboard')
        } else {
            return next()
        }
    }

ensureGuest 在里面运行/。如果 req.isAuthenticated 返回 TRUE,我应该被重定向到/dashboard而不是/像以前那样。

我在修复自己的错误方面学到了很多东西,现在我知道如何正确使用路由了!


推荐阅读