![](/img/trans.png)
[英]Authentication ExpressJS -> passportJs: Error: Can't set headers after they are sent
[英]passportjs get authentication error message
我正在使用Passportjs進行Facebook身份驗證。 這是我的Facebook策略:
passport.use(new FacebookStrategy({
clientID: config.facebook.clientID,
clientSecret: config.facebook.clientSecret,
callbackURL: config.facebook.callbackURL
}, function(accessToken, refreshToken, profile, done) {
User.findOne({ 'facebook.id': profile.id }, function (err, user) {
if (err) { return done(err); }
if (!user) {
user = new User({
name: profile.displayName,
email: profile.emails[0].value,
username: profile.username,
provider: 'facebook',
facebook: profile._json
});
user.save(function (err) {
if (err) {
console.log(err);
}
return done(err, user);
});
} else {
return done(err, user);
}
});
}));
我添加了以下路線:
app.get('/facebook/auth', passport.authenticate('facebook', { scope: [ 'email', 'user_about_me', 'publish_actions']}), function(req, res) { });
// I need the following fix due to this: http://stackoverflow.com/a/17015836/289246
app.get('/facebook/auth/callback', function(req, res, next) {
if (req.query && !req.query.error && req.query.error_code) {
req.query.error = true;
}
next();
},
passport.authenticate('facebook', { failureRedirect: '/facebook-auth-failure', successRedirect: '/auth-success', failureFlash: true })
);
app.get('/facebook-auth-failure', users.authFailure);
app.get('/auth-success', users.authSuccess);
我的users.authFailure方法是:
exports.authFailure = function (req, res) {
var error = ???
// How can I get here the error message??
res.render('auth-failure', {
error: error || 'An error has accured'
});
};
如果Facebook身份驗證失敗,如何獲取錯誤消息(我想向用戶顯示)?
由於您使用的是failureFlash
,因此應該這樣做:
var error = req.flash('error');
在使用Passport時,我遇到了許多問題,錯誤和配置問題。 我的解決方案是遷移到Everyauth。
我不知道這對您有什么用,但是我可以通過這種方式訪問Flash消息。 在定義FacebookStrategy時,請使用passReqToCallback參數。
passport.use(new FacebookStrategy({
clientID: facebook.getClientID(),
clientSecret: facebook.getClientSecret(),
callbackURL: facebook.getCallback(),
passReqToCallback: true
這樣您就可以像這樣將req.flash()作為參數添加到done()中
返回完成(false,用戶,reg.flash('成功','成功登錄')));
希望能為您或其他尋求幫助的人提供幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.