Google OAuth сломан после развертывания Heroku - PullRequest
0 голосов
/ 17 декабря 2018

Моя стратегия Google OAuth отлично работает на стороне клиента.Однако после развертывания проекта на heroku OAuth прерывается, как только Google пытается перенаправить пользователя обратно на указанный маршрут перенаправления.Я получаю сообщение об ошибке истечения срока ожидания запроса по маршруту / auth / google / callback /, по которому Google отправляет пользователя после проверки подлинности.Это определено в моих authRoutes (скриншот ниже).Я использую PassportJS и Express для своего бэкэнда.Мои ключи разработки были правильно настроены, как и мои маршруты OAuth Google, ошибка возникает только при перенаправлении из Google.Любая помощь будет высоко ценится

Вот моя стратегия паспорта:

const GoogleStrategy = require('passport-google-oauth20').Strategy
const keys = require('../config/keys')
const passport = require('passport')
const mongoose = require('mongoose')

const User = mongoose.model('users')

// This will store a cookie containing the user ID
// in our session after login is complete
passport.serializeUser((user, done) => {
    done(null, user.id);
  });

  // This is called during every request
  // It obtains a user object from the user id we serialized earlier
  // the user object is stored in req.user

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',
    proxy: true
    },
    async (accessToken, refreshToken, profile, done) => {
         const existingUser = await User.findOne({googleID: profile.id});

        if(!existingUser) {
            const user = await User.create({googleID: profile.id}).save()
            return done(null, user)
        }

        done(null, existingUser)


    })
)    

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

const passport = require('passport')

module.exports = app => {

// This handles getting authentication details
// (gmail profile) from google
app.get("/auth/google", passport.authenticate('google', {
    scope: ['profile', 'email']
}))

app.get("/auth/google/callback", passport.authenticate('google'), (req, res) => {
    res.redirect('/surveys')
})

app.get("/api/logout",  (req, res) => {
    // Provided by passport
    req.logout()
    res.redirect('/')
})

app.get("/api/current_user", (req, res) => {
    res.send(req.user)
})

}

И мойIndex.js:

const express = require('express');
const mongoose = require('mongoose');
const cookieSession = require('cookie-session');
const passport = require('passport');
const keys = require('./config/keys');
const bodyParser = require('body-parser')
require('./models/User');
require('./models/Survey');
require('./services/passport');

mongoose.connect(keys.mongoURI);

const app = express();

app.use(
  cookieSession({
    maxAge: 30 * 24 * 60 * 60 * 1000,
    keys: [keys.cookieKey]
  })
);
app.use(bodyParser.json())
app.use(passport.initialize());

// This middleware injects a cookie in every request
// to allow us to identify the user
app.use(passport.session());

require('./routes/authRoutes')(app);
require('./routes/billingRoutes')(app);


if(process.env.NODE_ENV == "production"){
  // Express will serve up production assets 
  // like our main.js file or main.css file!
  app.use(express.static('client/build'))

  // Express will serve up the index.html file 
  // if it doesn't recognize the route
  const path = require('path')
  app.get('*', (req, res ) => {
    res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'))
  })

}


const PORT = process.env.PORT || 5000;
app.listen(PORT);

Ошибка Heroku:

at=error code=H12 desc="Request timeout" method=GET path="/auth/google/callback?code=4/tgDTZZu8osZZvvMGjX4qaazb46SqNukZU6kNARY7R2enmH21cX6IfkVYSVnVHIoQ_qHaUbLttS_VGiS81KYE3D0&scope=email+profile+https://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/userinfo.profile" host=cryptic-citadel-17268.herokuapp.com request_id=e8eb956d-64e4-4217-b846-91c53953e0a7 fwd="193.203.134.47" dyno=web.1 connect=0ms service=30001ms status=503 bytes=0 protocol=https

1 Ответ

0 голосов
/ 17 декабря 2018

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

passport.use (
    new GoogleStrategy({
    clientID: keys.googleClientID,
    clientSecret: keys.googleClientSecret,
    callbackURL: '/auth/google/callback',
    proxy: true
    },
    async (accessToken, refreshToken, profile, done) => {
         const existingUser = await User.findOne({googleID: profile.id});

        if(!existingUser) {
            const user = await User.create({googleID: profile.id}).save()
            return done(null, user)
        }

        done(null, existingUser)
    })
...