2015-06-21 113 views
2

我試圖與Facebook的OAuth通passport.js進行認證,但sequelizejs拋出下面的錯誤驗證時Sequelizejs錯誤「不存在與passportjs(臉譜)

我的用戶模型是這樣的:

module.exports = function(sequelize, DataTypes) { 
    var User = sequelize.define("User", { 
    username: { 
     type: DataTypes.STRING, 
     allowNull: true, 
     validate: { 
     } 
    }, 
    displayName: { 
     type: DataTypes.STRING, 
     allowNull: true, 
     validate: { 
     } 
    }, 
    email: { 
     type: DataTypes.STRING(256), 
     allowNull: false, 
     validate: { 
     isEmail: true, 
     len: [5, 256] 
     } 
    }, 
    password: { 
     type: DataTypes.STRING, 
     allowNull: false, 
     validate: { 
     } 
    } 
    }, { 
    // lowercase tableName in Posrgres, if you need. 
    tableName: 'users', 
    classMethods: { 
     associate: function(models) { 
     User.hasMany(models.Candidate); 
     User.hasMany(models.Employer); 
     User.hasMany(models.Topic); 
     User.hasMany(models.Reply); 
     User.hasMany(models.Notification); 
     } 
    } 
    }); 

    return User; 
}; 

而且我passport.js文件看起來像這樣:

'use strict'; 

var passport = require('passport'); 
var FacebookStrategy = require('passport-facebook').Strategy; 

module.exports = function(app, User) { 

    app.use(passport.initialize()); 
    // Enable sessions 
    app.use(passport.session()); 

    passport.use(new FacebookStrategy({ 
     clientID: 652109234923404, 
     clientSecret: "f126af0ec55ca0c2bc8c7cb914b7cb6b", 
     callbackURL: "http://localhost:5000/auth/facebook/callback" 
    }, 
    function(accesstoken, tokenSecret, profile, done) { 
     // Could be an existing user or a new user 
     // profile.username is used as the username 
     User.findOrCreate({ 
     where: { 
      email: profile.emails, 
      displayName: profile.displayName 
     } 
     }).spread(function(user) { 
     return done(null, user); 
     }); 
    })); 

    // This just stores the username is an encrypted browser cookie 
    passport.serializeUser(function(user, done) { 
    done(null, user.username); 
    }); 

    // This fetches the user by username retrieved from the 
    // cookie that was set during serializeUser 
    passport.deserializeUser(function(uname, done) { 
    User.find({ 
     where: { 
     username: uname 
     } 
    }).then(function(user) { 
     if (!user) return done(new Error('Invalid user')); 
     return done(null, user); 
    }); 
    }); 

    // Redirect the user to facebook for authentication. When complete, Facebook 
    // will redirect the user back to the application at /auth/facebook/callback 
    //app.get('/auth/facebook', passport.authenticate('facebook')); 

    app.get('/auth/facebook', 
    passport.authenticate('facebook', { scope: ['email']}), 
     function(req, res){ 
    }); 
    // Facebook will redirect the user to this URL after approval. Finish the 
    // authentication process by attempting to obtain an access token. If access 
    // was granted, the user will be logged in. Otherwise, authentication has failed. 
    app.get('/auth/facebook/callback', 
    passport.authenticate('facebook', { 
     failureRedirect: '/login' 
    }), 
    function(req, res) { 
     res.cookie('signIn', 'true'); 
     res.redirect('/'); 
    } 
); 
    // This is the middleware that needs to be used for 
    // protecting APIs that require authorization 
    return function(req, res, next) { 
    // if user is authenticated in the session, carry on 
    if (req.isAuthenticated()) 
     return next(); 

    // if they aren't redirect them to the login page /auth/twitter 
    res.redirect('/auth/facebook'); 
    }; 
}; 

任何想法爲什麼sequelize會拋出這個錯誤?什麼是「價值」欄?

+0

最有可能的答案是,你是路過'value'到哪裏或什麼地方插入查詢。你得到的錯誤必須有一個附加的堆棧跟蹤,用它來查看哪個特定的調用失敗 –

回答

3

Profile是{ value, type }對象http://passportjs.org/docs/profile

數組所以你應該通過profile.emails[0].valueprofile.emails.map(p => p.value)

+0

謝謝Jan!這工作。但是,用戶模型需要密碼'allowNull:false',這意味着用戶不能從Facebook OAuth創建。如果您想要定期驗證以及OAuth,那麼建立用戶模型的普遍接受方式是什麼? – rahul2001