2015-06-21 3 views
2

Я пытаюсь проверить подлинность с facebook OAuth через passport.js но sequelizejs бросает следующее сообщение об ошибке:ошибка Sequelizejs при проверке подлинности passportjs (facebook)

сервера 0 (ERR): необработанное отказ SequelizeDatabaseError: колонка «значение "не существует

Моя модель пользователя выглядит следующим образом:

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' к где и вставить запрос где-нибудь. Ошибка, которую вы получаете, должна быть привязана к stacktrace, используйте это, чтобы увидеть, какой конкретный вызов терпит неудачу. –

ответ

3

Профиль представляет собой массив объектов { value, type }http://passportjs.org/docs/profile

Таким образом, вы должны пройти profile.emails[0].value или profile.emails.map(p => p.value)

+0

Thanks Jan! Это сработало. Однако для модели пользователя требуется пароль «allowNull: false», что означает, что пользователь не может быть создан из facebook OAuth. Каков общепринятый способ моделирования пользователя, если вы хотите регулярную аутентификацию, а также OAuth? – rahul2001

Смежные вопросы