护照Facebook验证回调未被调用

11

我正在制作一个Node应用程序,当我尝试与Facebook一起使用护照时,验证回调不运行(没有记录任何内容)。 如果有帮助,将不胜感激。

var express = require('express');
var routes = require('./routes/routes.js');
var layout = require('./routes/layout.js');
var facebook = require('./routes/facebook.js');
var editprof = require('./routes/editprof.js');
var app = express();
var vogels = require('vogels');
var passport = require('passport');
var FacebookStrategy = require('passport-facebook').Strategy;
var configAuth = require('./config/auth');


app.use(passport.initialize());
app.use(passport.session());

...

passport.use(new FacebookStrategy({

    // pull in our app id and secret from our auth.js file
    clientID        : configAuth.facebookAuth.clientID,
    clientSecret    : configAuth.facebookAuth.clientSecret,
    callbackURL     : 'http://localhost:8080/auth/facebook/callback'

},

// facebook will send back the token and profile
function(token, refreshToken, profile, done) {
    console.log("TOKEN",token);
    // asynchronous
    process.nextTick(function() {
        console.log("TOKEN",token);
        console.log("ID", profile.id);
        return done(null, profile);

    });

}));

...

app.get('/auth/facebook', passport.authenticate('facebook'));
app.get('/auth/facebook/callback', facebook.callback);

为什么还没有回答这个问题? - aditya
我遇到了同样的问题。你最终解决了吗? - James Trickey
2个回答

1
我曾遇到相同的问题,这是由于graph.facebook.com的DNS问题导致的。这会阻止passport-facebook后面的passport-oauth2模块获得FB令牌。然后跳过了verify回调函数。
您可以使用此处的js代码片段测试您是否遇到了相同的问题:
const dns = require('dns')
dns.lookup('graph.facebook.com', console.log)

如果这段代码返回类似于以下内容:
{ Error: getaddrinfo ENOTFOUND graph.facebook.com
    at errnoException (dns.js:28:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:73:26)
  code: 'ENOTFOUND',
  errno: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'graph.facebook.com' }

那么您的问题确实是由DNS问题引起的。

有多种方法可以解决DNS问题,但我认为最简单的方法是在我的Mac上手动编辑/private/etc/hosts文件:

步骤1:获取graph.facebook.com的IP地址:

nslookup graph.facebook.com

第二步:更新您的 /private/etc/hosts 文件:
sudo vim /private/etc/hosts

只需在文件底部添加一行(例如graph.facebook.com)

步骤3:再次测试dns.lookup('graph.facebook.com', console.log): 如果现在已解决,该命令应返回类似以下内容:

null '157.240.8.18' 4

希望这能解决你的问题。祝好,Nic。

1

我花了几个小时来解决这个问题。在我的情况下,问题出在Strategy构造函数的callbackURL属性上。当我尝试使用其他域名的URL时,回调没有被调用:

passport.use(new Strategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: 'https://my.domain.com/authorize'
} //callback
)

当我将它更改为相同域的链接时,它起作用了:
passport.use(new Strategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: '/auth/facebook/callback'
} //callback
)

另外,我已经在express中处理了这个url:

app.get('/auth/facebook/callback',
    passport.authenticate('facebook', {
        successRedirect: '/',
        failureRedirect: '/login'
    }));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接