【问题标题】:How to get the value from a promise based passport-local strategy?如何从基于承诺的护照本地策略中获得价值?
【发布时间】:2018-03-10 16:03:16
【问题描述】:

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

我将发布本地策略。一切正常,我得到了正确的信息。我只需要将这些信息获取到路线并能够使用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);
});

【问题讨论】:

  • @Bergi 那么我该如何在这里更正呢?我对此很陌生。
  • 删除“new Promise((resolve, reject) => {”和“.then(authUser => { resolve(authUser); }) .catch(err => { reject(err); }); })”部分
  • 哦,user = user 也是多余的

标签: node.js express promise bluebird passport.js


【解决方案1】:

主要需要注意的是Strategy的API不处理Promises。您必须处理它想要的回调参数。您可以在此处查看函数签名: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"));

【讨论】:

  • 是的,这是使用callbacks,我已经知道该怎么做,我想知道在做出承诺时该怎么做。或者如果可能的话?
  • @TaylorAustin 查看我的编辑。 Passport 还不支持 Promise。也许它会像 express 一样迁移。
  • 所以我实际上不能在本地策略中使用 resolve 或 reject 对吗?
  • @TaylorAustin 不,根据我在文档和来源中阅读的内容,我不相信。
猜你喜欢
  • 2023-03-24
  • 2022-12-17
  • 2016-05-29
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
相关资源
最近更新 更多