Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 来自回调函数的Passport facebook访问请求对象_Node.js_Facebook_Authentication_Facebook Authentication_Passport.js - Fatal编程技术网

Node.js 来自回调函数的Passport facebook访问请求对象

Node.js 来自回调函数的Passport facebook访问请求对象,node.js,facebook,authentication,facebook-authentication,passport.js,Node.js,Facebook,Authentication,Facebook Authentication,Passport.js,在Facebook对nodejs passport身份验证的回调中,如何在回调中获取req对象 passport.use(new FacebookStrategy({ clientID: 123456789, clientSecret: 'SECRET', callbackURL: "http://example.com/login/facebook/callback" }, function(accessToken, refreshToken, profile,

在Facebook对nodejs passport身份验证的回调中,如何在回调中获取
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?
  }
));
将选项设置为:

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
成为验证回调的第一个参数


根据

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

因此,我的脸书策略现在看起来像:

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);
                    });
                });
            }
        });
    }
);
在我的代码示例中,我添加了一些逻辑来在DB中保存用户信息,并在会话中保存用户详细信息。我想这可能对人们有帮助


req.user提供passport会话中存储的用户信息。

这也适用于我的facebook身份验证。谢谢!!这帮了大忙。谢谢!!这是一个很大的帮助。嘿@Tyguy7,你知道如何在这里得到res对象吗。我需要根据条件将用户重定向到某个页面。res.redirect()在这里如何工作?短暂性脑缺血发作