Настройка аутентификации Facebook с помощью MongoDB Atlas и Passport. js - PullRequest
0 голосов
/ 08 апреля 2020

Я провел много исследований, чтобы найти ответ на мою проблему, но я ничего не обнаружил. Не стесняйтесь прикреплять ссылку, если я пропустил ответ.

Я нашел это решение, но я не совсем уверен, как оно может быть применимо к этой ситуации: E11000 индекс ошибки дублирующегося ключа в mongodb mon goose

Я пытаюсь подключить мое приложение Express. js, MongoDB, Passport. js к Mon go -Atlas. Мой кластер Atlas настроен и принимает новых пользователей с моего локального хоста и использует Google Oauth 2.0, однако при попытке зарегистрироваться или войти в систему с помощью Facebook появляется следующая ошибка.

MongoError: E11000 duplicate key error collection: userDB.users index: username_1 dup key: { username: null } 

Возможно это как-то связано с этим?

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

Он работал при подключении к моему локальному хосту MongoDB, и, как я уже говорил, у меня возникли проблемы с поиском решения.

passport.use(new FacebookStrategy({
    clientID: process.env.FBAPPID,
    clientSecret: process.env.FBSECRET,
    callbackURL: "http://localhost:3000/auth/facebook/secrets"
  },
  function(accessToken, refreshToken, profile, cb) {
    console.log(profile);
    User.findOrCreate({ facebookId: profile.id }, function (err, user) {
      return cb(err, user);
    });
  }
));

app.get('/auth/facebook', passport.authenticate('facebook'));

app.get('/auth/facebook/secrets',
  passport.authenticate('facebook', { failureRedirect: '/login' }),
  function(req, res) {
    res.redirect('/secrets');
  });

ОБНОВЛЕНИЕ

Итак, я нашел документацию по удалению индексов на MongoDB Однако это не совсем понятно, поэтому я также нашел статью Удаление существующих индексов Итак, я реализовал код в мое собственное приложение. js файл.

// Dropping an Index in MongoDB
User.collection.dropIndex({name : "username_1"}, function(err, res) {
    if (err) {
        console.log('Error in dropping index!', err);
    }
});

Я перебрасывал базу данных между тестами, чтобы посмотреть, работает ли это, но я получаю эту ошибку все, независимо от того, как Я изменяю код, чтобы попытаться исправить его!

{ _bsontype: 'Timestamp', low_: 1, high_: 1586408833 },
  ok: 0,
  errmsg: `can't find index with key: { name: "username_1" }`,
  code: 27,
  codeName: 'IndexNotFound',
  '$clusterTime': {
    clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1586408833 },
    signature: { hash: [Binary], keyId: [Long] }
  },
  name: 'MongoError',
  [Symbol(mongoErrorContextSymbol)]: {}
}

И все же, когда я запускаю db.users.getIndexes() в моей оболочке Mon go, подключенной к моему серверу Atlas. Конечно же, это так! Я даже попытался использовать dropIndexes, и он только опустил индекс электронной почты! Я так расстроен этим!

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "userDB.users"
    },
    {
        "v" : 2,
        "key" : {
            "email" : 1
        },
        "name" : "email_1",
        "ns" : "userDB.users",
        "background" : true
    },
    {
        "v" : 2,
        "unique" : true,
        "key" : {
            "username" : 1
        },
        "name" : "username_1",
        "ns" : "userDB.users",
        "background" : true
    }
]

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

image> Collections >> {Collection name} >> Indexes >> Drop Index">

Наконец-то щелкнули! Я вошел во вкладку индексов на Атласе и удалил требуемый индекс имени пользователя. Спасибо за вашу помощь @oleg По какой-то причине я не смог найти это объяснение в Интернете!

Обновление

Так что удаление индекса из Mon go -Atlas только временно решает проблему. Я полагаю, что я понял, как удалить индекс из моего кода, но я уже удалил его из оболочки Mon go, что, похоже, также решило проблему. Поэтому я предоставлю обе команды:

const User = new mongoose.model('User', userSchema);

User.collection.indexExists({ "username" : 1 }, function(err, results){
  console.log(results);
  if ( results === true) {
    // Dropping an Index in MongoDB
    User.collection.dropIndex( { "username" : 1 } , function(err, res) {
        if (err) {
            console.log('Error in dropping index!', err);
        }
    });
  } else {
    console.log("Index doesn't exisit!");
  }
});

В понедельник go Shell, go в вашу БД и выполните эту команду:

db.users.dropIndex( { "username" : 1 } );

Для подтверждения выполните:

db.users.getIndexes() 

Столько часов исследований пытаются решить эту проблему! Я надеюсь, что это поможет вам!

0 голосов
/ 08 апреля 2020

У вас есть уникальный индекс, определенный для имени пользователя, но ваш код не вставляет имя пользователя (возможно, потому что имя пользователя не получено от поставщика аутентификации, как вы ожидаете). Это приводит к тому, что несколько документов с одним и тем же значением в поле username (null).

Если у ваших пользователей должно быть имя пользователя, вам необходимо отладить код, чтобы выяснить, почему он не получает имя пользователя или не передает его. в MongoDB. Если имя пользователя необязательно, удалите уникальный индекс для него.

...