node.js - 使用 Passport js 进行身份验证时 Sequelize Js 错误(facebook)

标签 node.js facebook oauth passport.js sequelize.js

我尝试通过 Passport.js 使用 facebook OAuth 进行身份验证,但sequelizejs 抛出以下错误:

server-0(错误):未处理的拒绝 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 会抛出此错误吗?什么是“值”列?

最佳答案

配置文件是一个 { value, type } 对象数组 http://passportjs.org/docs/profile

所以你应该传递 profile.emails[0].valueprofile.emails.map(p => p.value)

关于node.js - 使用 Passport js 进行身份验证时 Sequelize Js 错误(facebook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30961226/

相关文章:

javascript - 重复时如何从数组中删除 *some* 项? (首选 Lodash/Underscore)

node.js - 未找到模块 : Can't resolve 'fs' on @google-cloud/storage

facebook - wit.ai 理解选项卡未产生预期的意图角色

android - 将最新的 facebook 4.0.1 sdk 导入 eclipse 以作为 facebook 功能登录时出错

javascript - 跟踪 Facebook 点赞点击次数

java - uri.getQueryParameter ("oauth_verifier")始终为空

node.js - 当我已经在 Ubuntu 上安装了 nodejs 8 时,是否可以安装 NVM?

mobile - 对于可以支持多个 IDP 的 native 移动应用程序,最好的 SSO 解决方案是什么?

azure - AADSTS70007 : 'query' is not a supported value of 'response_mode' when requesting a token

javascript - selenium: ManagedPromise::32 {[[PromiseStatus]]: "pending"} 在导航到页面之前显示的消息