0

当我打电话passport.authenticate('facebook');时,页面继续加载并因超时而失败。facebook 身份验证屏幕永远不会出现。关于我在哪里犯错的任何线索?

以下是我的代码片段。

       var User = require('../models/user.js'),
       passport = require('passport'),
       FacebookStrategy = require('passport-facebook').Strategy;
   passport.use(new FacebookStrategy({
           clientID: 'appId-XXX',
           clientSecret: 'appSecret-xxx',
           callbackURL: 'https://xxx/auth/facebook/callback'
       },
       function(accessToken, refreshToken, profile, done) {
           process.nextTick(function() {
               var authID = 'facebook' + profile.id;
               User.findOne({
                   authId: authID
               }, function(err, user) {
                   if (err) return done(err, null);
                   if (user) return done(null, user);
                   user = new User({
                       authID: authID,
                       name: profile.displayName,
                       created: Date.now(),
                       role: 'customer'
                   });
                   user.save(function(err) {
                       if (err) return done(err, null);
                       done(null, user);
                   });
               });
           });

       }));

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

   app.get('/auth/facebook', function(req, res, next) {
       console.log('Calling Facebook Authenticate');
       passport.authenticate('facebook');
   });

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

1 回答 1

0

passport.authenticate返回一个中间件,这样使用:

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

由于您调用它而不是直接传递它,因此您应该调用它返回的中间件,并将req, res, next.

app.get('/auth/facebook', function(req, res, next) {
    console.log('Calling Facebook Authenticate');
    passport.authenticate('facebook')(req, res, next);
});
于 2014-10-27T15:18:58.667 回答