代码之家  ›  专栏  ›  技术社区  ›  starsneverfall

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

  •  1
  • starsneverfall  · 技术社区  · 8 年前

    我正在尝试用Facebook、Google和本地passport构建一个登录系统,我正在使用Node。js,护照。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错误,需要密码!我知道原因是我在使用Facebook登录时没有密码,但我可以如何处理此问题?我在GitHub上看到了这个页面 https://github.com/feathersjs/authentication/issues/168 但我仍然不知道如何使用这个feathers joi工具,有人能给我一些建议吗?非常感谢。

    这是我的脸书。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));
        }
      });
    }));
    

    我的护照。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);
    
                            }
    
                        });
    
                    }
    
                });
    
            }
    
        ));
    
    }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Ashh    8 年前

    试试这个

    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));
        }
      });
    }));
    
    推荐文章