【问题标题】:Passport-facebook access req object from within callback functionPassport-facebook 从回调函数中访问 req 对象
【发布时间】:2015-12-17 23:46:58
【问题描述】:

在来自 Facebook 的用于 nodejs 护照身份验证的回调中,如何在回调中获取 req 对象?

passport.use(new FacebookStrategy({
    clientID: 123456789,
    clientSecret: 'SECRET',
    callbackURL: "http://example.com/login/facebook/callback"
  },
  function(accessToken, refreshToken, profile, done){
    // Is there any way to get the req object in here?
  }
));

【问题讨论】:

    标签: node.js facebook authentication facebook-authentication passport.js


    【解决方案1】:

    设置passReqToCallback 选项,如下所示:

    passport.use(new LocalStrategy({ passReqToCallback: true },
      function(req, username, password, done) {
        User.findOne({ username: username }, function (err, user) {
          if (err) { return done(err); }
          if (!user) { return done(null, false); }
          if (!user.verifyPassword(password)) {
            req.flash('error', 'Your password is too long');
            req.flash('error', 'Also, it is too short!!!');
            return done(null, false);
          }
          return done(null, user);
        });
      }
    ));
    

    req 成为验证回调的第一个参数

    根据https://github.com/jaredhanson/passport/issues/39

    【讨论】:

    • 这也适用于我的 facebook 身份验证。
    • 谢谢!!这是一个很大的帮助。
    【解决方案2】:

    我回答得太晚了,但我认为我的解决方案更好,更传统。 在官方文档here。有一个部分“Association in Verify Callback”,其中提到如果我们将策略的 passReqToCallback 选项设置为 true,这将启用req,它将作为第一个参数传递给验证回调。

    所以我的 FacebookStrategy 现在看起来像:

    var User = require('../models/UserModel.js');
    var FacebookStrategy = require('passport-facebook').Strategy;
    
    exports.facebookStrategy = new FacebookStrategy({
            clientID: 'REPLACE_IT_WITH_CLIENT_ID',
            clientSecret: 'REPLACE_IT_WITH_CLIENT_SECRET',
            callbackURL: 'http://localhost:3000/auth/facebook/callback',
            passReqToCallback: true
        },function(req,accessToken,refreshToken,profile,done){
            User.findOne({
                    'facebook.id' : profile.id
                },function(err,user){
                if(err){
                    done(err);
                }
                if(user){
                    req.login(user,function(err){
                        if(err){
                            return next(err);
                        }
                        return done(null,user);
                    });
                }else{
                    var newUser = new User();
                    newUser.facebook.id = profile.id;
                    newUser.facebook.name = profile.displayName;
                    newUser.facebook.token = profile.token;
                    newUser.save(function(err){
                        if(err){
                            throw(err);
                        }
                        req.login(newUser,function(err){
                            if(err){
                                return next(err);
                            }
                            return done(null,newUser);
                        });
                    });
                }
            });
        }
    );
    

    在我的代码示例中,我添加了一些逻辑来将用户信息保存在数据库中并在会话中保存用户详细信息。我认为它可能对人们有所帮助。

    req.user 给出护照会话中存储的用户信息。

    【讨论】:

    • 谢谢!!这是一个很大的帮助。
    • 嘿@Tyguy7 关于如何在这里获取 res 对象的任何想法。我需要根据条件将用户重定向到某个页面。 res.redirect() 在这里如何工作? TIA
    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2022-10-30
    • 2015-01-03
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多