快速护照检查用户是不是已通过身份验证
Posted
技术标签:
【中文标题】快速护照检查用户是不是已通过身份验证【英文标题】:express passport check if user is authenticated快速护照检查用户是否已通过身份验证 【发布时间】:2018-12-21 17:08:46 【问题描述】:我正在使用护照登录并显示“/home”。登录有效并重定向到“/home”。但是这个端点不受保护,可以通过在浏览器中输入来访问。我尝试使用 req.isAuthenticated () (并在这里经历了多个问题)无济于事。
路由//index.js
var express = require('express');
var router = express.Router();
var User = require('../models/user');
var passport = require('passport');
var session = require('express-session');
const LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
function(username, password, done)
User.findOne(
username: username
, function(err, user)
if (err)
return done(err);
if (!user)
return done(null, false);
if (user.password != password)
return done(null, false);
return done(null, user);
);
));
router.get('/', function(req, res, next)
res.render('index', title: 'Express' );
);
router.get('/login', function(req, res, next)
res.render('login');
);
router.post('/login', passport.authenticate('local', failureRedirect : '/', successRedirect : '/home'))
router.get('/register', function(req, res, next)
res.render('register');
);
router.get('/logout', function(req, res)
req.logout();
res.redirect('/');
);
router.get('/home', ensureLocalAuthenticated, function(req, res)
res.render('home', user: req.user );
);
function ensureLocalAuthenticated(req, res, next)
console.log(req.isAuthenticated());
if (req.isAuthenticated()) return next();
res.redirect('/login');
module.exports = router;
在我的 app.js 文件中,我已经像这样配置了护照:
//passportconfig
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user, done)
done(null, user.id)
)
passport.deserializeUser(function(id, done)
User.findById(id, function(err, user)
done(err, user)
)
)
app.use('/', indexRouter);
app.use('/users', usersRouter);
isAuthenticated 总是返回 false,无法使用该中间件登录。如果我删除它,我可以正常登录,但所有用户都可以访问“/home”
【问题讨论】:
req.user
给你什么?试着把它放在ensureLocalAuthenticated
我在ensureLocalAuthenticated
中添加了console.log(req.user)
。它返回未定义。我尝试登录后
这意味着护照无法加载用户。在passport.serializeUser
中查看user
和req.cookies
的值是什么
另外,您使用的是cookie-parser
吗?因为这会加载解析并加载cookie,所以passport会使用cookie来加载用户。
嘿,我想通了。这在 app.js 中丢失了。谢谢app.use(require('express-session')( secret: 'keyboard cat', resave: false, saveUninitialized: false ));
【参考方案1】:
将以下行添加到 app.js 对我有用:
app.use(require('express-session')(
secret: 'keyboard cat',
resave: false,
saveUninitialized: false
));
所以护照配置如下:
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var passport = require('passport');
var mongoose = require('mongoose');
var User = require('./models/user')
const LocalStrategy = require('passport-local').Strategy;
使用它们:
app.use(express.json());
app.use(express.urlencoded( extended: false ));
app.use(cookieParser());
app.use(require('express-session')(
secret: 'keyboard cat',
resave: false,
saveUninitialized: false
));
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded( extended: false ))
app.use(bodyParser.json())
app.use(express.static(path.join(__dirname, 'public')));
//passportconfig
app.use(passport.initialize());
app.use(passport.session());
// used to serialize the user for the session
passport.serializeUser(function(user, done)
done(null, user.id);
//
);
// used to deserialize the user
passport.deserializeUser(function(id, done)
User.findById(id, function(err, user)
done(err, user);
);
);
【讨论】:
以上是关于快速护照检查用户是不是已通过身份验证的主要内容,如果未能解决你的问题,请参考以下文章
我是不是需要使用快速会话以及护照和 JSON Web 令牌进行身份验证?