0

我在 express js 中使用 passport-google-oauth20 GoogleStrategy 进行用户登录。Heroku 上的网站托管。当我尝试登录时,所有用户详细信息都会进入 mongodb 数据库,但屏幕卡在 Heroku 错误“应用程序错误”页面中。在此之后,当我直接输入我网站的主页网址时,我发现我已登录。之后一切正常。现在主要问题是“为什么在按下谷歌登录按钮后屏幕卡在 Heroku 的“应用程序错误”页面中?” 当我检查 Heroku 日志时,我发现应用程序使用“http”协议而不是“https”获取路径,该协议已经在 Google 开发人员控制台授权重定向 URI 上更新。如果您理解问题,请给出您的意见。比你。代码在这里更清晰:-

配置/passport.js

    const GoogleStrategy = require('passport-google-oauth20').Strategy
const FacebookStrategy = require('passport-facebook').Strategy
const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt')

const User = require('../models/User')

module.exports = function (passport) {
  passport.use(
    new GoogleStrategy(
      {
        clientID: process.env.GOOGLE_CLIENT_ID,
        clientSecret: process.env.GOOGLE_CLIENT_SECRET,
        callbackURL: '/auth/google/callback',
      },
      async (accessToken, refreshToken, profile, done) => {
        console.log(profile)
        console.log(passport.session._id)
        const newUser = {
          Id: profile.id,
          provider: profile.provider,
          displayName: profile.displayName,
          firstName: profile.name.givenName,
          lastName: profile.name.familyName,
          image: profile.photos[0].value,
          email: profile.emails[0].value,
        }
        try {
          let user = await User.findOne({ googleId: profile.id })

          if (user) {
            done(null, user)
          } else {
            user = await User.create(newUser)
            done(null, user)
            if (user) {
              done(null, user)
            }
          }
        } catch (err) {
          console.error('==========', err)
        }
      }
    )
  )

路线/auth.js

const express = require('express')
const passport = require('passport')
const router = express.Router()

//google
router.get('/google', passport.authenticate('google', { scope: ['email','profile'] }))
router.get('/google/callback',
  passport.authenticate('google', {successRedirect: '/',failureRedirect: '/auth/login' }));

//根目录 index.js

const path = require('path')
const express = require('express')
const dotenv = require('dotenv')
const methodOverride = require('method-override')
const passport = require('passport')
const Session = require('express-session')
const MongoStore = require('connect-mongo')
const connectDB = require('./config/db')
const flash = require('connect-flash');
const fileUpload = require('express-fileupload')
var exphbs = require('express-handlebars');
const app = express()
const log = function (request, response, next) {
  console.log(`${new Date()}: ${request.protocol}://${request.get('host')}${request.originalUrl}`);
  console.log(request.body); // make sure JSON middleware is loaded before this line
  next();
}
global.loggedIn = '';

dotenv.config({ path: './config/config.env' })
require('./config/passport')(passport)
connectDB()
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
app.use(
  methodOverride('_method', function (req, res) {
    if (req.body && typeof req.body === 'object' && '_method' in req.body) {
      let method = req.body._method
      delete req.body._method
      return method
    }
  })
)
app.set('view engine', 'ejs')
app.engine('handlebars', exphbs({ defaultLayout: 'main' }));
app.set('view engine', 'handlebars');
try {
  app.use(
    Session({
      secret: 'keyboard cat',
      resave: false,
      saveUninitialized: false,
      store: MongoStore.create({
        mongoUrl: process.env.MONGO_URI
      })
    })
  )
  console.log("Sessions successfully initialized!");
} catch (err) {
  console.log(`Error setting up a mongo session store! `);
}

// Passport middleware
app.use(passport.initialize())
app.use(passport.session())

app.use(fileUpload())
app.use(flash());
app.use(log);

// Set global var
app.use(function (req, res, next) {
  console.log('express session', req.session)
  console.log('passport session', req.user)
  res.locals.user = req.user || null
  loggedIn = res.locals.user
  next()
})
app.use(express.static(path.join(__dirname, 'public')))

app.use('/', require('./routes/index'));
app.use('/auth', require('./routes/auth'));
app.use('/', require('./routes/reviews'));
app.use('/', require('./routes/comments'));
app.use((req, res) => res.render('notfound.ejs'));

const PORT = process.env.PORT || 4000
app.listen(
  PORT,
  console.log(`Server running in ${process.env.NODE_ENV} mode on port ${PORT}`)
)
4

0 回答 0