如何从基于承诺的本地护照策略中获取价值?

How to get the value from a promise based passport-local strategy?

我正在使用 passport-local 作为我的策略,并使用 bluebird 来实现这一承诺。我不确定这是否是一件坏事,但这是我想做的。我目前的问题是我不知道如何从我的路线中获取 resolve 和/或 reject 值。

我会post本地策略。一切正常,我得到了正确的信息。我只需要将此信息获取到路线并能够使用 req.user

我收到 authUser 并且还收到任何 errors,例如自定义错误密码错误。但如果看到其他代码有帮助,请告诉我。

passport.use(
  new LocalStrat((username, password) => {
    return new Promise((resolve, reject) => {
      controllers.user
        .getUserByUsername(username)
        .then(user => {
          user = user;
          return controllers.user.comparePassword(password, user);
        })
        .then(authUser => {
          resolve(authUser);
        })
        .catch(err => {
          reject(err);
        });
    });
  })
);

/* User Login */
router.post('/login', passport.authenticate('local'), (req, res) => {
  // Need to access promise values here 
  console.log(req.user);
});

您需要注意的主要事情是 Strategy 的 API 不处理 Promise。您必须处理它想要的回调参数。您可以在此处查看函数签名:Configure Strategy。在我的实现中,我的 User 处理 Promises 并且只是从 Promise.

then() 中调用回调

由于您必须将要使用的 Strategy 交给 passport,而 passport 需要回调约定,因此您必须遵循它的 API。截至目前,passport 并不真正支持其 API 中的 Promises。我会说看看护照问题 Add support promises flow 并添加对与承诺集成的支持。不过,我认为在 express 迁移之前不会发生这种情况。

这是我使用Strategys处理异步登录的方式:

const express = require("express"),
    passport = require("passport"),
    Strategy = require("passport-local").Strategy,
    User = require("../models/user"),
    router = express.Router();

// Strategy to authenticate a user
const localStrategy = new Strategy((username, password, cb) => {
    User.authenticate(username, password).then((result) => {
        if (result.success) {
            cb(null, result.user);
        } else {
            cb(null, false);
        }
    }, cb);
});

function ensureLoggedIn(req, res, next) {
    if (req.isAuthenticated()) {
        return next();
    }
    res.redirect("/login");
}

// Utilize the strategy
passport.use(localStrategy);

router.use(require("./passify"));
router.use("/profile", ensureLoggedIn, require("./profile"));