1

我有一个现有的用户群,我想允许他们链接到他们的 Facebook/Twitter 帐户。看起来我可以使用passportjs,但有困难,

现在,在他们的用户/密码中传递一个 url,我做了一个本地策略,然后查找用户。然后我想执行我认为的授权。我收到 facebook 提示询问我是否要允许,我用 accessToken 打了回调,但是我无法将该令牌绑定到我的数据库中的现有用户,因为我现在看到了获取请求信息的方法。

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('/');
  }
);
4

2 回答 2

1

假设用户已经使用本地策略登录,用户应该在请求中作为 req.user 可用。然后,您可以将 facebook 凭据信息添加到现有用户对象。

于 2013-04-14T05:05:55.413 回答
0

检查您在 Facebook 回调中重定向到的 URL,并确保在本地登录和从 Facebook 定向到回调的时间之间没有生成不同的会话。

我有一个类似的问题让我发疯,这是因为我的重定向不同。

例如,我http://localhost:3000在 Chrome 中导航,登录并且 req.user 设置正确。在我的 Facebook 开发设置和 Passport 配置中,我重定向到http://hostname.local:3000/auth/facebook.

只要您的本地登录和重定向共享同一个会话,那么 req.user 就应该可用。

于 2013-06-21T08:11:01.520 回答