使用 Google 身份验证重定向时卡住

时间:2021-03-27 19:58:45

标签: javascript node.js express sequelize.js passport-google-oauth

我正在尝试按照 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.

让我列出一些调试过程仅供参考:

  1. 如教程视频所示,我将数据库改回 MongoDB,一切顺利。
  2. 我将路由更改为 root '/',问题仍然存在。如果我跳过身份验证部分并输入“localhost:3000/dashboard”,它运行良好。
  3. 无论我单击现有用户还是新用户,数据库都运行良好。它在 routes/auth.js 表中返回正确的数据。

任何建议将不胜感激。

0 个答案:

没有答案