2013-04-14 7 views
1

У меня есть существующая пользовательская база, которую я хочу разрешить им связывать со своими учетными записями Facebook/Twitter. Похоже, я могу использовать паспортные документы, но у меня есть трудности,Подключить локальных пользователей к Facebook/Twitter с помощью PassortJS

Прямо сейчас, у вас есть пропуск у пользователя/прохода, я делаю локальную страгию и ищу пользователя. Затем я хочу выполнить авторизацию, которую я предполагаю. Я получаю промо-ролики facebook, спрашиваю, хочу ли я разрешить, и я ударил обратный вызов с помощью accessToken, но у меня нет возможности связать этот токен с существующим пользователем в моем db, поскольку теперь я вижу способ получения информации о запросе.

passport.serializeUser(function(user, done) { 
    done(null, user); 
}); 

passport.deserializeUser(function(user, done) { 
    Users.findOne({_id: user._id}, function(err, user) { 
     return done(err, user); 
    }); 
}); 

passport.use(new LocalStrategy({ passReqToCallback: true }, function(req, username, password, done) { 
     Users.findOne({_id: username}, function(err, user) { 
      return done(null, user); 
     }); 
    } 
)); 


passport.use(new FacebookStrategy({ 
    clientID: 'xxxx', 
    clientSecret: 'xxxx', 
    callbackURL: "http://xxxx/facebook/callback", 
    passReqToCallback: true 
    }, 
    function(req, accessToken, refreshToken, profile, done) { 

    // How would I get access to the user found in the LocalStrategy here so I can associate the accessToken to the user in the db? 
    console.log(accessToken); 
    console.log(refreshToken); 

    var err = null; 
    var user = {}; 
    return done(err, user); 

    } 
)); 

server.get('/facebook', passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }), 
    function (req, res) { 
     if (req && req.user) { 
      passport.authorize('facebook', { scope: ['publish_actions','manage_pages'] })(req, res); 
     } 
}); 

server.get('/facebook/callback', 
    passport.authorize('facebook', { failureRedirect: '/facebook/failure', successRedirect: '/facebook/success' }), 
    function(req, res) { 
    res.redirect('/'); 
    } 
); 
+0

Ознакомьтесь с [настоящим руководством] (http://passportjs.org/guide/authorize/) с веб-сайта Passport, в котором описано, как связать сторонние учетные записи с существующими пользователями. – robertklep

ответ

1

Предполагая, что пользователь уже вошел в систему с локальной стратегии, пользователь должен быть доступен по запросу в качестве req.user. Затем вы можете добавить данные учетной записи facebook в существующий пользовательский объект.

+1

Спасибо за помощь Кевин. Внутри функции обратного вызова в FacebookStrategy req.user не существует. Любые идеи, что мне не хватает? – BigPoppa

+0

Как раз так я понятен, пользователь уже вошел в систему со своим именем пользователя на этом этапе? –

+0

Да, используя локальную стратегию. – BigPoppa

0

Проверьте, какой URL-адрес вы перенаправляете на свой обратный вызов Facebook и убедитесь, что вы не создаете разные сеансы между моментом, когда вы входите в систему локально, и временем, которое вы направляете на ваш обратный вызов от Facebook.

У меня была аналогичная проблема, которая сводила меня с ума, и это потому, что мои переадресации были разными.

Например, я перешел на http://localhost:3000 в Chrome, вход в систему и req.user устанавливались правильно. В моих настройках Facebook и настройках Passport я перенаправлялся на http://hostname.local:3000/auth/facebook.

До тех пор, пока ваш локальный логин и переадресация будут иметь один и тот же сеанс, тогда должен быть доступен req.user.