护照本地mongoose req.user undefined

时间:2015-11-05 18:47:11

标签: javascript node.js mongodb express passport.js

我在使用护照本地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()

任何人都可以告诉我原因是什么吗?

谢谢!

2 个答案:

答案 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