Авторизация через вк, используя passport.js

198
22 мая 2018, 19:10

Пытаюсь реализовать авторизацию пользователя на сейте через соц. сеть ВК. Выдает ошибку: . Как её исправить? или как правильно реализовать эту функцию? passport.js:

var vkStrategy = configAuth.vkAuth;
var User = require('../app/models/user');
vkStrategy.passReqToCallback = true; // проверет, вошел ли пользователь в систему или нет
passport.use(new VKStrategy(vkStrategy,
  function(req, accessToken, refreshToken, params, profile, done) {
    //     function (req, token, refreshToken, profile, done) {
    // ассинхронность
    process.nextTick(function() {
      // проверка существования логина
      if (!req.user) {
        User.findOrCreate({
          vkontakteId: profile.id
        }, function(err, user) {
          //   User.findOne({'vkontakte.id': profile.id}, function (err, user) {
          if (err)
            return done(err);
          if (user) {
            if (!user.vkontakte.token) {
              user.vkontakte.token = token;
              user.vkontakte.name = profile.name.givenName + ' ' + profile.name.familyName;
              user.vkontakte.email = (profile.emails[0].value || '').toLowerCase();
              user.save(function(err) {
                if (err)
                  return done(err);
                return done(null, user);
              });
            }
            return done(null, user); //если пользователь найден
          } else {
            // если нет, создаем нового
            var newUser = new User();
            newUser.vkontakte.id = profile.id;
            newUser.vkontakte.token = token;
            newUser.vkontakte.name = profile.name.givenName + ' ' + profile.name.familyName;
            newUser.vkontakte.email = (profile.emails[0].value || '').toLowerCase();
            newUser.save(function(err) {
              if (err)
                return done(err);
              return done(null, newUser);
            });
          }
        });
      } else {
        // пользователь существует и вошел в систему, аккаунты связываются
        var user = req.user;
        user.vkontakte.id = profile.id;
        user.vkontakte.token = token;
        user.vkontakte.name = profile.name.givenName + ' ' + profile.name.familyName;
        user.vkontakte.email = (profile.emails[0].value || '').toLowerCase();
        user.save(function(err) {
          if (err)
            return done(err);
          return done(null, user);
        });
      }
    });
  }));

auth.js:

module.exports = {
    'vkAuth': {
        'lang': 'ru',
        'clientID'  : '###',
        'clientSecret' : '#######',
        'callbackURL' : 'http://localhost:8080/auth/vkontakte/callback',
        'profileFields' : ['id', 'email', 'name']
    }
}

user.js:

var mongoose = require('mongoose');
var bcrypt   = require('bcrypt-nodejs');
var userSchema = mongoose.Schema({
   vkontakte        : {
        id           : String,
        token        : String,
        email        : String,
        name         : String
    }
});
module.exports = mongoose.model('User', userSchema);
Answer 1

Не могу комментарий оставить.. нехватает репы, поэтому ответом.
С чего Вы взяли, что функция findOrCreate() есть в VK API?
Как выйти из этой ситуации сейчас: просто замените findOrCreate() на findOne() и обрабатывайте результат так.
Либо можно использовать библиотеку: https://github.com/drudge/mongoose-findorcreate

READ ALSO
Как сделать такую функцию?

Как сделать такую функцию?

Есть тег span со значением 15, как через некие интервалы времени уменьшать это значение, то есть 15, 14, 13, 12, 11

201
Конвертировать DOC(s) в PDF в JavaScript

Конвертировать DOC(s) в PDF в JavaScript

Возник такой вопрос

172
Кнопка Поделиться

Кнопка Поделиться

Раньше была сама кнопка ПоделитьсяГде сейчас найти её код?

161