Вопрос

При обратном вызове от 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?
  }
));
Это было полезно?

Решение

Установка 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

Другие советы

Я слишком поздно отвечаю, но я думаю, что мое решение лучше и более обычное. В официальной документации Здесь .Существует раздел « Association в проверке обратного вызова », в котором упоминается, что если мы устанавливаем вариант стратегии PASSREQLLBALLBALLBALBALLBALLBALLBALLBALLBALLBALLBALLBALK , это позволяет 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);
                    });
                });
            }
        });
    }
);
.

В моем коде образец я добавил некоторую логику для сохранения информации о пользователе в DB и сохранение деталей пользователей в сеансе.Я думал, что это может быть полезно людям.

REQ.USER дает информацию о пользователе, хранящейся на паспортной сессии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top