@kr_ilya

Как правильно настроить passport-vkontakte?

Добрый день!

Делаю авторизацию на сайте с помощью Вк, используя passport-vkontakte, с одной стороны всё по инструкции, с другой - что-то ничего не выходит.

(Да и примеры в документации мягко говоря так себе. Ничего внятного я в них не увидел, поэтому если есть готовые реализации, прошу скинуть ссылки, буду собирать этот конструктор по примеру)

Вот до чего сейчас дошел:
var passport = require('passport');
var AuthVKStrategy = require('passport-vkontakte').Strategy;
app.use(require('express-session')({secret:'keyboard cat', resave: true, saveUninitialized: true}));
app.use(passport.initialize());
app.use(passport.session());

passport.use(new AuthVKStrategy(
  {
    clientID:     vk_app_id, // VK.com docs call it 'API ID', 'app_id', 'api_id', 'client_id' or 'apiId'
    clientSecret: vk_app_secret,
    callbackURL:  "http://localhost:3000/auth/vkontakte/callback"
  },
  function(accessToken, refreshToken, params, profile, done) {
      // User.findOrCreate({ vkontakteId: profile.id }, function (err, user) {
      //   return done(err, user);
      // });

      return done(null, profile);
  }
));

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

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

app.get('/auth/vkontakte',
  passport.authenticate('vkontakte', {
    scope: ['status', 'email', 'friends', 'notify'],
    profileFields: ['email', 'city', 'bdate']
  }),
  function(req, res){
    // The request will be redirected to vk.com for authentication, with
    // extended permissions.
  });

app.get('/auth/vkontakte/callback',
  passport.authenticate('vkontakte', {
    successRedirect: 'http://localhost:3000/vk',
    failureRedirect: 'http://localhost:3000/fail' 
  })
);

app.get('/vk', function(req, res) {
    //Here you have an access to req.user
    res.send('ok')
    // res.json(req.user)
    console.log(req.user);
});

app.get('/logout', function (req, res) {
  req.logout();
  res.redirect(`http://localhost:3002`);
});


На основании вышесказанного у меня возникает несколько вопросов:
1. Что делают passport.serializeUser и passport.deserializeUser нужны ли они вообще. + при выполнении кода вылетает ошибка ReferenceError: User is not defined

2. Как сделать сохранение сессии? По кукам? Хочу использовать MongoDB, что в нее записывать? accessToken?

3. Просто при переходе по адресу localhost:3000/auth/vkontakte всё работает нормально, а вот если вызвать этот адрес через axios по кнопке на фронтэнде по адресу http://localhost:3002, то CORS не дает выполнить запрос к API вк и выдает в консоль это

Access to XMLHttpRequest at 'https://oauth.vk.com/authorize?response_type=code&...' (redirected from '127.0.0.1:3000/auth/vkontakte') from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Хотя в самом начале файла имеется
var cors = require('cors')
app.use(cors());
  • Вопрос задан
  • 722 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы