2016-11-26 110 views
0

我正在嘗試調試我的Google OAuth2安裝程序無法使用我的憑據登錄OAuth登錄窗口。儘管遵循了這些文檔,但是當調用passport.authorize('google', { scope : ['profile'] })時,由於路由被觸發,然後有一個無限循環,直到超時並且出現錯誤GET http://localhost:3000/auth/google net::ERR_CONNECTION_REFUSED,我的代碼似乎失敗了。Passportjs Google身份驗證失敗

我試圖查看我的護照設置,但文檔中的代碼示例沒有任何區別,也不知道錯誤來自哪裏,因爲我的終端中沒有任何內容記錄在Google Auth triggered之外的控制檯日誌中

這裏是PassportJS設置:

var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 
var GoogleStrategy = require('passport-google-oauth20').Strategy; 
var models = require('../app/models/db-index'); 
var configAuth = require('./auth'); 
var bcrypt = require('bcrypt-nodejs'); 

/*==== Passport Configuration ====*/ 

// Serialize sessions 
passport.serializeUser(function(user, done) { 
    console.log("User ID: " + user.userId + " is serializing"); 
    done(null, user.userId); 
}); 

passport.deserializeUser(function(userId, done) { 
    models.User.find({ 
     where: { 
      userId: userId 
     } 
    }).then(function(user) { 
     console.log("User ID: " + user.userId + " is deserializing"); 
     done(null, user); 
    }).error(function(err) { 
     done(err, null); 
    }); 
}); 

/*==== Local Configuration ====*/ 

//Login logic 
passport.use('local', new LocalStrategy({ 
    passReqToCallback: true, 
    usernameField: 'email' 
}, function(req, email, password, done) { 
    //Find user by email 
    models.User.findOne({ 
     where: { 
      email: req.body.email 
     } 
    }).then(function(user) { 
     if (!user) { 
      done(null, false, { 
       message: 'The email you entered is incorrect' 
      }, console.log("Unknown User")); 
     } else if (!user.validPassword(password)) { 
      done(null, false, console.log("Incorrect Password")); 
     } else { 
      console.log("User match"); 
      done(null, user); 
     } 
    }).catch(function(err) { 
     console.log("Server Error"); 
     return done(null, false); 
    }); 
})); 

//Sign Up Logic 
passport.use('local-signup', new LocalStrategy({ 
    passReqToCallback: true, 
    usernameField: 'email' 
}, function(req, email, password, done) { 
    models.User.findOne({ 
     where: { 
      email: email 
     } 
    }).then(function(existingUser) { 
     if (existingUser) 
      return done(null, false, req.flash('error', 'Email already exists.')); 
     if (req.user && password === confirmPassword) { 
      var user = req.user; 
      user.firstName = firstName; 
      user.lastName = lastName; 
      user.email = email; 
      user.password = models.User.generateHash(password); 
      user.save().catch(function(err) { 
       throw err; 
      }).then(function() { 
       done(null, user, req.flash('error', 'All fields need to be filled in')); 
      }); 
     } else { 
      var newUser = models.User.build({ 
       firstName: req.body.firstName, 
       lastName: req.body.lastName, 
       email: req.body.email, 
       password: models.User.generateHash(password) 
      }); 

      newUser.save().then(function() { 
       done(null, newUser); 
      }).catch(function(err) { 
       done(null, false, console.log(err)); 
      }); 
     } 
    }).catch(function(e) { 
     done(null, false, req.flash('error', 'All fields need to be filled in'), console.log(e.email + e.message)); 
    }) 
})); 

/*==== Google Configuration ====*/ 

passport.use(new GoogleStrategy({ 
    clientID: 'client-id-hash.apps.googleusercontent.com', 
    clientSecret: 'secret-hash', 
    callbackURL: 'http://localhost:3000/auth/google/callback' 
    }, function(accessToken, refreshToken, profile, cb) { 
    console.log('First Google Config fired'); 
     models.ExternalAccount.findOrCreate({ 
      externalSourceId: profile.id 
     }).then(function(err, externalAccount){ 
      console.log('Sequelize Google query fired without issues'); 
      return cb(err, externalAccount) 
     }); 
    })); 

module.exports = passport; 

這裏是我的路線:

var express = require('express'); 
var siteRoutes = express.Router(); 
var path = require('path'); 
var passport = require(path.resolve(__dirname, '..', '..', './config/passport.js')); 

/*==== /AUTH/GOOGLE ====*/ 

siteRoutes.route('/auth/google') 
    .get(function(req, res){ 
     console.log('Google Auth triggered'); 
     passport.authorize('google', { scope : ['profile'] }) 
    }); 

/*==== /AUTH/GOOGLE/CALLBACK ====*/ 

siteRoutes.route('/auth/google/callback') 
    .get(function(req, res){ 
     passport.authorize('google', { 
      successRedirect : '/app', 
      failureRedirect : '/login', 
      failureFlash: 'Invalid Google credentials.' 
     }); 
    }); 

回答

1

認證通話本身就是一箇中間件。據我可以從文檔中看出,根本沒有authorize調用。因此,您的回撥路線應如下所示:

/*==== /AUTH/GOOGLE/CALLBACK ====*/ 

siteRoutes.route('/auth/google/callback') 
    .get(passport.authenticate('google', { 
      successRedirect : '/app', 
      failureRedirect : '/login', 
      failureFlash: 'Invalid Google credentials.' 
     })); 
+0

很棒!這一改變以及刪除路線的功能部分解決了問題。謝謝! – cphill