Google OAuth Nodejs обрабатывает ошибку, используя паспорт, passport-google-oauth20 - PullRequest
0 голосов
/ 27 сентября 2018

Я пишу аутентификацию Nodejs API, используя passport , passport-google-oauth20

Все работает, но проблема теперь в том, что я хочу проверить электронную почтупользователь через домен.Моя система только позволяет электронной почте с доменом @ framgia.com может войти в систему.Если нет, отправьте пользователю обратно сообщение.

Мой код здесь:

const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;

const mongoose = require('mongoose');
const keys = require('../config/keys');

const User = mongoose.model('users');

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

passport.deserializeUser((id, done) => {
  User.findById(id).then(user => {
    done(null, user);
  })
});

passport.use(
  new GoogleStrategy(
    {
      clientID: keys.googleClientID,
      clientSecret: keys.googleClientSecret,
      callbackURL: '/auth/google/callback',
    },
    async (accessToken, refreshToken, profile, done) => {

      const existingUser = await User.findOne({ googleId: profile.id });
      if (existingUser) {
        return done(null, existingUser);
      }

      if (!profile._json.domain || profile._json.domain !== 'framgia.com') {
        return done(null, {error: 'Not allow access!'});
      }

      const user = await new User({
        googleId: profile.id,
        email: profile.emails[0].value,
        name: profile.displayName,
        avatar: profile.photos[0].value,
      }).save();

      done(null, user);
    },
  ),
);

И я пишу такой логический код:

if (!profile._json.domain || profile._json.domain !== 'framgia.com') {
    return done(null, {error: 'Not allow access!'});
}

Но ядумаю, что это не сработает, но я не знаю, как обработать ошибку и отправить сообщение обратно пользователю.

Мои маршруты:

const passport = require('passport');

module.exports = (app) => {
  app.get(
    '/auth/google',
    passport.authenticate('google', {
      scope: ['profile', 'email'],
    }),
  );

  app.get(
    '/auth/google/callback',
    passport.authenticate('google', { failureRedirect: '/login' }),
    (req, res) => {
      // Successful authentication, redirect home.
      res.redirect('/');
    },
  );
};

Как обработать ошибку и перенаправить на маршрут / ошибку с некоторым сообщением?

Любые идеи будут высоко оценены, спасибо.

1 Ответ

0 голосов
/ 27 сентября 2018

Прежде всего, если вы хотите вернуть пользователя только в том случае, если электронная почта имеет определенный домен, вам нужно поставить логику проверки домена до findOne().В соответствии с текущей логикой, если вы нашли пользователя, он просто вернет его без проверки домена электронной почты

//check email domain before finding the user

if (!profile._json.domain || profile._json.domain !== 'framgia.com') {
  return done(null, {error: 'Not allow access!'});
}

const existingUser = await User.findOne({ googleId: profile.id });
if (existingUser) {
  return done(null, existingUser);
}

Согласно паспортной документации js, http://www.passportjs.org/docs/configure/ (проверьте раздел обратного вызова проверки)

Может быть предоставлено дополнительное информационное сообщение для указания причины сбоя.Это полезно для отображения флэш-сообщения, предлагающего пользователю повторить попытку.

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

return done(null, false, { message: 'Not allow access!' });
...