javascript - 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;
解决方案
首先,为了减少 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
而不是/
像以前那样。
我在修复自己的错误方面学到了很多东西,现在我知道如何正确使用路由了!
推荐阅读
- python - 使用 python 将 Hive 与 keytab 连接
- c# - 在 net.core 项目中使用 google firestore
- c# - 在 C# 中使用 PDFsharp-wpf 将 txt 文件转换为 pdf
- flutter - Google Calendar API 返回通用错误请求
- ios - 我的颤振应用程序没有在 ios 上请求 background_loaction 权限
- python - 如何使用 Python 使用文本文件中的数据创建图形
- ansible - Ansible:为服务分配唯一的端口
- javascript - 如何在对象数组中进行数学运算?
- reactjs - 用firestore反应material-ui deafultValue异步问题
- flutter - 在 vscode 中,如何在一个 launch.json 中有多个颤振目标?