node.js - 由于本地 Passport 中的用户模型设置,无法使用 facebook 登录

标签 node.js sequelize.js passport.js passport-local

我正在尝试构建一个使用 Facebook、Google 和本地 Passport 的登录系统,我使用 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));
    }
  });
}));

关于node.js - 由于本地 Passport 中的用户模型设置,无法使用 facebook 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48258415/

相关文章:

node.js - Sequelize 在创建时抛出 'id must be unique'

node.js - 使用node.js和mongoose以及expressjs和passportjs进行身份验证

node.js - 尝试通过 mongoose 使用 Node js 将对象保存在文档上时出现问题

javascript - AngularJS 中 Controller 之间如何共享数据?

javascript - 所有 Sequelize 验证都收到非错误警告?

node.js - 如何使用 sequelize 软删除

sql-server - 使用node js将多列和行插入SQL Server

node.js - Mongoose 选择要从 findOneAndUpdate 返回的字段

javascript - 为什么mysql查询 "select count(*) from table"返回 "[object Object]"作为结果?

node.js - passport.js 中的多个模型