我在 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}`)
)