Passport-google-oauth не работает с атласом mongodb, но отлично работает с локальным mongodb - PullRequest
0 голосов
/ 06 августа 2020

Я делаю аутентификацию входа в Google с помощью стратегии паспорт-google-oauth20. Итак, я создал отдельный файл для настройки стратегии Google для паспорта, и в этом файле я сохраняю данные профиля пользователя в mongodb. Когда я использую местный mongodb, все работает нормально. Но, когда я использую атлас mongodb. он подключается к uri, но когда я нажимаю на вход через Google, перенаправление занимает вечность.

паспортная настройка. js

const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const keys = require('./keys');
const User = require('../models/user-model');
console.log('zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz')
passport.serializeUser((user, done) => {
done(null, user.id);
});

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

passport.use(
new GoogleStrategy({
    // options for google strategy
    clientID: keys.google.clientID,
    clientSecret: keys.google.clientSecret,
    callbackURL: '/auth/google/redirect'
}, (accessToken, refreshToken, profile, done) => {
    // check if user already exists in our own db
    User.findOne({googleId: profile.id}).then((currentUser) => {
        console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
        if(currentUser){
            // already have this user
            console.log(profile.emails[0].value);
           // console.log('user is: ', email);
            done(null, currentUser);
        } else {
            // if not, create user in our db
            new User({
                googleId: profile.id,
                username: profile.displayName,
                gmail: profile.emails[0].value
            }).save().then((newUser) => {
                console.log('created new user: ', newUser);
                done(null, newUser);
            });
        }
    });
})
);

I я подключаю mongodb в приложении. js, и я сохранил URI в отдельном файле. В приложении js я создал маршруты авторизации, для которых есть отдельный файл, из которого я прикрепляю необходимую информацию.

auth-routes. js

router.get('/google', passport.authenticate('google', {
scope: 
['https://www.googleapis.com/auth/userinfo.profile','https://www.googleapis.com/auth/userinfo.email']
}));

// callback route for google to redirect to
// hand control to passport to use code to grab profile info
router.get('/google/redirect', passport.authenticate('google'), (req, res) => {
   // res.send(req.user);
    res.redirect('/profile');
});

прим. js

const express = require('express');
const cookieSession = require('cookie-session');
const passport = require('passport');
const authRoutes = require('./routes/auth-routes');
const profileRoutes = require('./routes/profile-routes');
const passportSetup = require('./config/passport-setup'); 
const mongoose = require('mongoose');
const keys = require('./config/keys');

const app = express();

// set view engine
app.set('view engine', 'ejs');

// set up session cookies
app.use(cookieSession({
    maxAge: 24 * 60 * 60 * 1000,
    keys: [keys.session.cookieKey]
}));

// initialize passport
app.use(passport.initialize());
app.use(passport.session());


// connect to mongodb
mongoose.connect(keys.mongodb.dbURI, () => {
    console.log('connected to mongodb');
});

// set up routes
app.use('/auth', authRoutes);
app.use('/profile', profileRoutes);

// create home route
app.get('/', (req, res) => {
    res.render('home');
});

app.listen(3000, () => {
    console.log('app now listening for requests on port 3000');
});
...