我在使用护照本地mongoose插件实施护照js时遇到以下问题。帐户创建和登录工作正常。但是,在我登录后,护照永远不会将我识别为已登录的用户。
我使用了以下代码:
在我的用户模型中:
User.plugin(passportLocalMongoose);
在app.js中(包含的顺序是正确的吗?):
app.use(logger('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser('keyboard cat'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({ secret: 'keyboard cat' }));
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
在我的路线中:
router.post('/login', passport.authenticate('local'), function(req, res) {
res.json({ loggedIn: true });
});
返回true,但以下内容保持返回false(登录后):
req.isAuthenticated()
任何人都可以告诉我原因是什么吗?
谢谢!
答案 0 :(得分:1)
你可能想尝试使用Express middelware,正如评论中所建议的那样。
例如:
function isAuthenticated(req, res, next) {
if(req.isAuthenticated()) {
return next()
} else {
// redirect users to login page
}
}
app.get('/anypage', isAuthenticated, function(req, res) {
// some reoute logic
})
答案 1 :(得分:1)
从它的外观来看,你的订单很好。订单中最重要的部分是passport.initialize()
配置后passport.session()
和express-session
。
至于初始身份验证工作的问题,但后续请求显示未经身份验证的用户,问题很可能是因为cookie。我之前遇到过类似的问题,问题在于客户端发出HTTP请求的方式。
如果您使用的是ES6 fetch
API,则需要确保将密钥credentials
传递给值为"include"
的options对象。
例如:
fetch('/restricted', {
method: 'get',
credentials: 'include'
});
fetch
API不会在Cookie中发送凭据,除非您将其指定为。希望这会有所帮助。
其他资源:https://developers.google.com/web/updates/2015/03/introduction-to-fetch