繁体   English   中英

如何在node.js中使用passport-facebook获取复杂情况下的配置文件数据

[英]How to get profile data in complex case using passport-facebook in node.js

我正在使用passport-facebook ,但是这样-

app.get('/oauth/facebook', passport.authenticate('facebook', {}));

不符合我的要求,因为我需要在会话中保存数据。 如果我仅将passport.authenticate放在另一个函数中,将无法正常工作,如下所示:

app.get('/oauth/facebook', function (req, res, next) { 
    passport.authenticate('facebook', {});
}); // doesn't work

但是,如果我调用此函数,它会起作用,如下所示:

const fbAuth = (req, res) => {
    req.session.isRegisterUser = req.query.isRegisterUser || false;
    req.session.regUserId = req.params.id > 0 ? req.params.id : null;
    req.session.redirectUrlAfterSignIn = req.query.redirectUrl ? req.query.redirectUrl : null;

    return passportFacebook.authenticate('facebook', {}, function() {
        // NEVER called
        console.log('auth cb');
    });
};

// this is the only way I could pass (req, res)
router.get('/oauth/:id/facebook', 
    (req, res) => fbAuth(req, res)(req, res));

它不调用第三个参数函数,但会重定向。 因此,此后转到回调函数:

const fbCb = (req, res) => {
    return console.log(req.session.regUserId);
};

router.get('/oauth/facebook/callback', (req, res) => fbCb(req, res)(req, res));

这可行,但是如何获取个人资料数据? 原因是在我的网址中只有参数code ,如果我理解正确的话,它就是access_token。

我以与文档中相同的方式初始化策略:

const passport = require('passport');
const Strategy = require('@passport-next/passport-facebook').Strategy;

passport.use(new Strategy({
        clientID: process.env.FACEBOOK_APP_ID,
        clientSecret: process.env.FACEBOOK_SECRET,
        callbackURL: 'http://localhost:3001/api/oauth/facebook/callback',
        graphApiVersion: 'v3.1',
        // scope: ['email']
    },
    function(accessToken, refreshToken, profile, cb) {
        // NEVER called
        console.log(`accessToken`, accessToken);
        console.log(`profile`, profile);
        return cb(null, profile);
    }
));

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

passport.deserializeUser(function(id, done) {
    return models.User.findById(id).then(user=>{
        done(null, user);
    }).catch(function (err) {
        done(null, null);
    });
});

module.exports = passport;

但是从未调用过function(accessToken, refreshToken, profile, cb) 但是,我需要访问请求,以便可以检查会话数据,因此我需要在回调函数中提供所有这些,而不是在这里。

所以,我有点沮丧,为什么它变得如此复杂。 为了解决这个问题,可能我可以通过URL https://graph.facebook.com/v3.1/me?...获取数据并解析JSON。 但是,为什么我需要这个库呢?

您可以在这里找到所有代码

我发现有必要第二次调用passportFacebook.authenticate来调用回调。 并且可以在函数内部执行此操作,这是您唯一应该返回函数passportFacebook.authenticate (调用它)的结果的方法。 最终代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM