【问题标题】:Passport authentication not being called未调用护照身份验证
【发布时间】:2018-11-06 17:52:02
【问题描述】:

我在路由器中有代码

router.post('/auth', function(req, res) {
    oauth.auth(req, res);
});

正确命中

accesstokenController.auth = function(req, res) {
  console.log('Here auth called');
    passport.initialize(), passport.authenticate(
      'local', {
        session: false,
        scope: []
      },(req,res)), serialize, generateToken, respond
  };

(req,res) 在获得建议此链接的链接后添加

我相信它现在应该调用

passport.use(new Strategy(
  function(username, password, done) {
    console.log('Here pass called with ' + username + ' - ' + password);
    db.authenticate(username, password, done);
  }
));

但它从来没有调用过并且发生了超时。

如果我是这样直接调用的

app.post('/auth', passport.initialize(), passport.authenticate('local', { session: false,scope: [] }), serialize, generateToken, respond);

没关系,

在我上面的方法中

accesstokenController.auth = function(req, res) {
      console.log('Here auth called');
        passport.initialize(), passport.authenticate(
          'local', {
            session: false,
            scope: []
          },(req,res)), serialize, generateToken, respond
      };

我刚刚创建了一个单独的方法并从路由器页面调用它,而不是调用它的 thislef

我错过了什么

其他代码

const db = {
    updateOrCreate: function(user, cb) {
      cb(null, user);
    },
    authenticate: function(username, password, cb) {
      console.log('Here called');
      User.findOne({ username: username,
        password: password }).exec(function (err, user) {
        if (err) {
          cb(null,null);
        }
        else {
          cb(null,user);
        }
      });
    }
  }

function serialize(req, res, next) {
  console.log('Here pass called with ser ');
  db.updateOrCreate(req.user, function(err, user) {
    if (err) {
      return next(err);
    }
    // we store information needed in token in req.user again
    req.user = {
      id: user.id
    };
    next();
  });
}

function generateToken(req, res, next) {
  req.token = jwt.sign({
    id: req.user.id,
  }, SECRET, {
    expiresIn: TOKENTIME
  });
  next();
}

function respond(req, res) {
  res.status(200).json({
    user: req.user,
    token: req.token
  });
}

我有很多相关的链接,但没有设法解决这个问题

【问题讨论】:

  • 你的 db.authenticate 是否调用了 done 函数?
  • 标准做法是在这里自己调用done(),同时返回来自db调用的错误/数据。
  • 另外,要最终得到响应,您需要在respond() 中添加res.send()
  • 我更新了鉴权方法

标签: node.js express routing passport.js


【解决方案1】:

您的策略需要返回done(),否则策略不知道何时完成,从而导致超时。

如果没有进一步的上下文,很难说这是否是确切的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 2017-01-06
    • 2019-02-28
    • 2018-05-02
    • 1970-01-01
    • 2021-07-05
    • 2018-02-13
    • 2015-09-06
    相关资源
    最近更新 更多