我正在制作节点应用,当我尝试在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);
答案 0 :(得分:0)
我遇到了同样的问题,这是graph.facebook.com
的DNS问题。这可以防止passport-oauth2
后面的passport-facebook
模块获取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
第2步:更新/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
希望这可以解决您的问题。
干杯,
尼克
答案 1 :(得分:0)
我为此问题苦了几个小时。就我而言,问题在于callbackURL
构造函数的Strategy
属性。当我尝试使用其他域的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
)
另外,我已经用快递处理了这个网址:
app.get('/auth/facebook/callback',
passport.authenticate('facebook', {
successRedirect: '/',
failureRedirect: '/login'
}));