我正在尝试按照 tutorial video from Traversy 使用 Node.js、Express 和 Google OAuth2.0 制作一个简单的应用程序。不同的是我想使用 Sequelize +本视频中使用 MySQL 来部署数据库,而不是使用 MongoDB。
config/passport.js 的代码如下所示:
var GoogleStrategy = require('passport-google-oauth20').Strategy
const sequelize = require('sequelize')
const User = require('../models/UserMySQL')
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) => {
const newUser = {
googleId: profile.id,
displayName: profile.displayName,
image: profile.photos[0].value
}
try {
let user = await User.findOne({
where: { googleId: profile.id}
})
// Check whether user has existed in DB.
if(user) {
return done(null, user)
} else {
// create a new user
user = await User.create(newUser)
return done(null, user)
}
} catch (err) {
console.error(err);
}
}))
passport.serializeUser((user, done) => {
done(null, user.id);
console.log("serialize done, user.id is:", user.id);
});
passport.deserializeUser((id, done) => {
User.findByPk(id, (err, user) => done(err, user));
console.log("deserialize done, id is:", id);
});
}
请注意,当我复制 official code of Passport 反序列化用户实例 User.findById
时,它弹出一个错误“TypeError: the findById is not a function”。因此,我将其替换为 User.findByPk
,这是 Sequelize v6.0 的语法。
routes/auth.js 的代码如下所示:
const express = require('express')
const passport = require('passport')
const router = express.Router()
// @desc Auth with Google
// @route Get /auth/google
router.get('/google', passport.authenticate('google', {scope: ['profile']}))
// @desc Google auth callback
// @route Get /auth/google/callback
router.get('/google/callback', passport.authenticate('google', {failureRedirect: '/'}), (req, res) => {
res.redirect('/dashboard')
console.log("redirect to dashboard");
})
module.exports = router
app.js的Passport相关代码如下所示:
const passport = require('passport')
const session = require('express-session')
// Passport config
require('./config/passport')(passport) // Need to pass in the argument
// Sessions
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: false
}))
// Passport middleware
app.use(passport.initialize())
app.use(passport.session())
// Routes
app.use('/', require('./routes/index'))
app.use('/auth', require('./routes/auth'))
问题是点击google账号后页面卡住了,没有调用重定向路径。 Stucking after clicking the account.
下面是我点击谷歌账户时的控制台信息。我在重要的函数中插入了一些检查点,其中一些被打印出来,但是route.get('/google/callback', ...)
的{{1}}函数中的日志没有被打印出来。我们也可以看到已经返回了谷歌回调代码。
Returning information at console.
让我列出一些调试过程仅供参考:
routes/auth.js
表中返回正确的数据。任何建议将不胜感激。