如何从基于承诺的本地护照策略中获取价值?
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
处理 Promise
s 并且只是从 Promise
.
的 then()
中调用回调
由于您必须将要使用的 Strategy
交给 passport,而 passport 需要回调约定,因此您必须遵循它的 API。截至目前,passport 并不真正支持其 API 中的 Promises。我会说看看护照问题 Add support promises flow 并添加对与承诺集成的支持。不过,我认为在 express 迁移之前不会发生这种情况。
这是我使用Strategy
s处理异步登录的方式:
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"));
我正在使用 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
处理 Promise
s 并且只是从 Promise
.
then()
中调用回调
由于您必须将要使用的 Strategy
交给 passport,而 passport 需要回调约定,因此您必须遵循它的 API。截至目前,passport 并不真正支持其 API 中的 Promises。我会说看看护照问题 Add support promises flow 并添加对与承诺集成的支持。不过,我认为在 express 迁移之前不会发生这种情况。
这是我使用Strategy
s处理异步登录的方式:
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"));