无法使用 facebook 登录,因为本地护照中的用户模型设置

Can't use facebook to login because user model setting in local passport

我正在尝试使用 Facebook、Google 和本地护照构建一个登录系统,我正在使用 Node.js、passport.js 和 ORM 来完成它,但我遇到了一个现在的问题,我的用户模型如下

const User = connection.define('user', {   googleID: {
    type: Sequelize.STRING,   },   facebookID: {
    type: Sequelize.STRING,   },   firstname: {
          type: Sequelize.STRING,
          notEmpty: true,
        },

  lastname: {
          type: Sequelize.STRING,
          notEmpty: true,
        },

  username: {
          type: Sequelize.TEXT,
        },

  email: {
          type: Sequelize.STRING,
          validate: {
              isEmail: true,
            },
        },

  password: {
          type: Sequelize.STRING,
          allowNull: false,
        },

  last_login: {
          type: Sequelize.DATE,
         }, });

设置后,每当我想通过Facebook登录我的网站时,它一直显示SEQUELIZE ERROR,需要密码!我知道这是因为我在使用 Facebook 登录时没有密码,但我该如何处理这个问题?我在 GitHub https://github.com/feathersjs/authentication/issues/168 上看到了这个页面 但是我仍然不知道如何使用这个 feathers-joi 工具,有人可以给我一些建议吗?谢谢

这是我的 Facebook.js 代码

const passport = require('passport');
const cookieSession = require('cookie-session');
const FacebookStrategy = require('passport-facebook').Strategy;
const User = require('../models/User');
const keys = require('../secret/keys.js');

passport.serializeUser((user, done) => {
  done(null, user.id);
});
passport.deserializeUser((id, done) => {
  User.findById(id).then(user => {
    done(null, user);
  });
});

passport.use(new FacebookStrategy({
  clientID: keys.facebookClientID,
  clientSecret: keys.facebookClientSecret,
  callbackURL: '/auth/facebook/callback',
}, (accessToken, refreshToken, profile, done) => {
  User.findOne({ where: { facebookID: profile.id } }).then(existinguser => {
    if (existinguser) {
      //Nothing will happen, the ID already exists
      done(null, existinguser);
    }else {
      User.create({ facebookID: profile.id }).then(user => done(null, user));
    }
  });
}));

我的 passport.js 如下所示(仍然需要一些修复)

var bCrypt = require('bcrypt-nodejs');


module.exports = function(passport, user) {


    var User = user;

    var LocalStrategy = require('passport-local').Strategy;


    passport.use('local-signup', new LocalStrategy(

        {

            usernameField: 'email',

            passwordField: 'password',

            passReqToCallback: true // allows us to pass back the entire request to the callback

        },



        function(req, email, password, done) {

            var generateHash = function(password) {

                return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null);

            };



            User.findOne({
                where: {
                    email: email
                }
            }).then(function(user) {

                if (user)

                {

                    return done(null, false, {
                        message: 'That email is already taken'
                    });

                } else

                {

                    var userPassword = generateHash(password);

                    var data =

                        {
                            email: email,

                            password: userPassword,

                            firstname: req.body.firstname,

                            lastname: req.body.lastname

                        };

                    User.create(data).then(function(newUser, created) {

                        if (!newUser) {

                            return done(null, false);

                        }

                        if (newUser) {

                            return done(null, newUser);

                        }

                    });

                }

            });

        }

    ));

}

试试这个

passport.use(new FacebookStrategy({
  clientID: keys.facebookClientID,
  clientSecret: keys.facebookClientSecret,
  callbackURL: '/auth/facebook/callback',
}, (accessToken, refreshToken, profile, done) => {
  User.findOne({ where: { facebookID: profile.id } }).then(existinguser => {
    if (existinguser) {
      //Nothing will happen, the ID already exists
      done(null, existinguser);
    }else {
        var object = {
            facebookID: profile.id,
            password: ""
        }
      User.create(object).then(user => done(null, user));
    }
  });
}));