【问题标题】:passport local mongoose req.user undefined护照本地猫鼬 req.user 未定义
【发布时间】:2017-01-04 08:13:28
【问题描述】:

我目前在使用护照本地猫鼬插件实施护照js期间遇到以下问题。帐户创建和登录工作正常。但是,在我登录后,passport 永远不会将我识别为已登录的用户。

我使用了以下代码:

在我的用户模型中:

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()

谁能告诉我可能是什么原因?

谢谢!

【问题讨论】:

  • 您是否正在尝试实施一种快速方法来确保您的用户在访问您的应用程序的某些部分之前已经过身份验证?如果是这样,我会建议您创建一个 express.js 中间件的简单方法,该中间件将检查用户是否登录,如果没有 - 将重定向到 /login 页面。
  • res.json({ loggedIn: true }); 将始终返回 true。 res.json({loggedIn: req.isAuthenticated()}) 是否返回 true?
  • res.json({ loggedIn: true });并不总是返回 true。 passport.authenticate('local') 是认证失败时不调用 next() 的中间件。

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


【解决方案1】:

您可能想按照 cmets 中的建议尝试 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
 })

【讨论】:

  • 这与它无关。即使我之前成功登录,req.isAuthenticated() 也总是返回 false。我觉得这是一个会话/cookies 问题。
【解决方案2】:

从外观上看,您的订单很好。订单中最重要的部分是让passport.initialize()passport.session() 出现在您的express-session 配置之后。

关于初始身份验证工作的问题,但后续请求显示未经身份验证的用户,问题很可能是由于 cookie。我之前遇到过类似的问题,问题出在客户端发出 HTTP 请求的方式上。

如果您使用的是 ES6 fetch API,那么您需要确保将密钥 credentials 传递给值为 "include" 的选项对象。

例如:

fetch('/restricted', {
  method: 'get',
  credentials: 'include'
});

fetch API 不会在 cookie 中发送凭据,除非您指定它。希望这会有所帮助。

其他资源:https://developers.google.com/web/updates/2015/03/introduction-to-fetch

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2016-10-19
    • 2019-10-05
    • 2018-07-31
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多