我正在尝试使用我的应用程序进行Facebook身份验证。但到目前为止,我的尝试都没有成功。我是Node的新手。
当用户点击该fb登录按钮时,需要将请求转到/ auth / facebook路由,并将其传递给Passport策略。他们将被发送到Facebook进行身份验证。但它永远不会发生。 Facebook认证窗口永远不会显示出来。看起来重定向不起作用。我做了几个小时的搜索,但没有得到解决方案。
以下是我认为对此上下文非常重要的代码部分
我已将我的App ID和App Secret放入 config / auth.js
module.exports = {
'facebookAuth' : {
'clientID' : 'my-AppID-here',
'clientSecret' : 'my-App-secret-here',
'callbackURL' : 'http://localhost:8080/auth/facebook/callback'
}
};
使用Facebook进行身份验证并处理回调的策略位于 config / passport.js
var LocalStrategy = require('passport-local').Strategy;
var FacebookStrategy = require('passport-facebook').Strategy;
// load up the user model and auth variables
var User = require('../app/models/user');
var configAuth = require('./auth');
module.exports = function(passport) {
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
// Facebook Strategy
passport.use(new FacebookStrategy({
// pull app id and secret from our auth.js file
clientID : configAuth.facebookAuth.clientID,
clientSecret : configAuth.facebookAuth.clientSecret,
callbackURL : configAuth.facebookAuth.callbackURL
},
// facebook will send back the token and profile
function(token, refreshToken, profile, done) {
process.nextTick(function() {
// find the user in the database based on their facebook id
User.findOne({ 'facebook.id' : profile.id }, function(err, user) {
if (err)
return done(err);
// if the user is found, then log them in
if (user) {
return done(null, user);
} else {
// if there is no user found with that facebook id, create them
var newUser = new User();
// set all of the facebook information in our user model
newUser.facebook.id = profile.id; // set the users facebook id
newUser.facebook.token = token; // we will save the token that facebook provides to the user
newUser.facebook.name = profile.name.givenName + ' ' + profile.name.familyName; // look at the passport user profile to see how names are returned
newUser.facebook.email = profile.emails[0].value; // facebook can return multiple emails so we'll take the first
// save our user to the database
newUser.save(function(err) {
if (err)
throw err;
// if successful, return the new user
return done(null, newUser);
});
}
});
});
}));
};
来自app / routes.js的相关路线
module.exports = function(app, passport) {
// route for facebook authentication and login
app.get('/auth/facebook', passport.authenticate('facebook', { scope : 'email' }));
// handle the callback after facebook has authenticated the user
app.get('/auth/facebook/callback',
passport.authenticate('facebook', {
successRedirect : '/profile',
failureRedirect : '/'
}));
// route for logging out
app.get('/logout', function(req, res) {
req.logout();
res.redirect('/');
});
};
视图中的登录按钮代码
<a href="/auth/facebook" class="btn btn-primary"><span class="fa fa-facebook"></span> Facebook</a>
答案 0 :(得分:3)
问题是我没有在Facebook应用设置中附加域名(在我的情况下是http://localhost:8080
)。
转到基本选项卡下的设置页面
http://localhost:8080/
一旦我这样做,我的问题就解决了。
答案 1 :(得分:0)
app.get('/auth/facebook', passport.authenticate('facebook', { scope : 'email' }));
此外,上述内容应改为:
app.get('/auth/facebook', passport.authenticate('facebook', { scope : ['email'] }));