【问题标题】:NodeJS - Passport local strategy gives me 404NodeJS - Passport 本地策略给了我 404
【发布时间】:2018-03-15 19:55:49
【问题描述】:

当我尝试使用 Passport 登录时,我非常头疼。 我正在使用电子邮件和密码向 /login 发出发布请求。 Passport 对其进行了正确的身份验证,不调用 err 然后返回 res.redirect('/user') 也被调用,但它返回 404 并且不重定向。 我不知道为什么会这样。这是我的代码:

服务器(index.js):

const
  express = require('express'),
  app = express(),
  mongoose = require('mongoose'),
  passport = require('passport'),
  cookieSession = require('cookie-session'),
  bodyParser = require('body-parser'),
  keys = require('./config/keys'),
  user = require('./models/User'),
  passportService = require('./services/passport'),
  authRoutes = require('./routes/auth');

mongoose.connect(keys.mongoURI);

app.use(bodyParser.json());
app.use(
  cookieSession({
    maxAge: 15 * 24 * 60 * 60 * 1000,
    keys: [keys.cookieKey]
  })
);
app.use(passport.initialize());
app.use(passport.session());

passportService(passport);

authRoutes(app);

const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
});

passportService (passport.js):

const LocalStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const User = mongoose.model('users');

module.exports = (passport) => {
  passport.serializeUser((user, done) => {
    done(null, user._id);
  });

  passport.deserializeUser((id, done) => {
    User.findById(id).then(user => {
      done(null, user);
    });
  });

  passport.use(
    new LocalStrategy(
    {
      usernameField: 'emailaddr',
      passwordField: 'passwd'
    },
  function(username, password, done) {

  User.findOne({ email: username }, function(err, user) {

    if(err){
      return done(err);
    }
    if(!user) {
      console.log('User not found with email: ', username);
      return done(null, false);
    }
    if(user.password != password) {
      console.log('Invalid password');
      return done(null, false)
    }

    return done(null, user);
  });

}));

}

认证路由:

const passport = require('passport');

module.exports = app => {

  app.post('/api/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/user');
    });
  })(req, res, next);
  });

}

/user 没有路由,因为我在客户端使用 React 和 React Router。 我需要你的帮助!!!

【问题讨论】:

  • 请不要寻求帮助,而是问一个简单的问题,以便更容易理解您的关注。
  • @ibenjelloun 我是新来的。我已经编辑了帖子,我认为更容易理解。问候。
  • 你的 React / React Router 代码在哪里?听起来 Passport 正在运行,但也许您没有将 /user 添加到您的前端 routes...
  • @user 我的 React / React Router 代码正在运行。如果我手动将 url 操作到 /user ,则会显示视图。
  • @ELopez 是否需要为 /user 添加指向包含 React 应用程序的 .html 文件的 Passport 路由?如果 JS 没有被提供给浏览器,客户端路由不会生效。

标签: javascript node.js express passport.js


【解决方案1】:

我建议不要在 authenticate 函数上使用自定义回调。相反,如果您有一个用户附加到请求对象,请检查是否在调用 api 并运行身份验证之后。

// calling redirects from your api will be problematic with react router
// allow your front end to decide what route to call based on the response 
  
app.post('/api/login', passport.authenticate('local'), function(req, res, next) {
  if(req.user) {
    res.json(req.user);
  } else {
    // handle errors here, decide what you want to send back to your front end
    // so that it knows the user wasn't found
    res.statusCode = 503;
    res.send({message: 'Not Found'})
  }
});

【讨论】:

  • 这可能是一个解决方案,在客户端处理重定向,但在我的上一个项目中,我使用了带有护照谷歌策略的 React / React Router 并且 res.redirect() 工作正常。我不知道为什么这次不工作。
猜你喜欢
  • 1970-01-01
  • 2017-02-25
  • 2014-04-10
  • 2023-04-05
  • 2015-01-03
  • 1970-01-01
  • 2023-03-25
  • 2019-03-19
  • 1970-01-01
相关资源
最近更新 更多