Passport实现Google认证问题:无法强制用户重新选择账号登录
Gmail OAuth认证自动选号导致登录中断问题
已在应用中实现基于Gmail账号的认证功能,但存在以下问题:用户再次登录时,浏览器会自动选中之前使用的账号,导致登录流程中断。调研得知添加prompt: "select_account"参数应该能解决该问题,但实际无效果。
登录流程
- 前端调用以下端点:
router.get( "/auth/google", passport.authenticate("google", { scope: [ "email", "profile", ], prompt: "select_account", }) );
- 用户选择账号后,会被重定向至回调端点:
router.get( "/auth/google/callback", passport.authenticate("google", { failureRedirect: baseFrontendUrl, session: false, }), function (req, res) { User.findOne({ _id: req.user._id }) .then((user) => { const payload = { id: req.user._id, }; console.log("🚀 ~ file: users.js:178 ~ .then ~ payload", payload); jwt.sign( payload, keys.SecretKey, { expiresIn: 3600 * 24 * 356 }, (error, token) => { if (error) { res.status(400).json({ message: "Error logging in user.", }); } else { const redirect_url = `${baseFrontendUrl}/OAuthRedirecting?token=${token}`; res.redirect(redirect_url); } } ); }) .catch((error) => { res.status(500).json({ message: "An error occured authenticating user using google.", }); }); } );
问题核心
用户未选择账号时,不会被重定向至回调端点,导致二次登录失败。
已尝试的方案
- 尝试强制用户每次登录都选择账号,但未找到有效方法。
- 在Google Passport策略中添加日志,但用户二次登录时无任何日志输出,说明该策略未被调用。策略实现代码如下:
passport.use( new GoogleStrategy(googe_passport_config, function ( request, accessToken, refreshToken, google_profile, done ) { let name = !!google_profile._json.given_name ? google_profile.given_name : "Name"; let surname = !!google_profile._json.family_name ? google_profile.family_name : "Surname"; let email = !!google_profile._json.email ? google_profile.email : ""; User.findOne({ email: google_profile._json.email }) .then((user) => { if (!!user) { return done(null, user); } else { userServices .registerUserThroughGoogleAuth( name, surname, email, google_profile.id ) .then((created_user) => { if (!!created_user) { return done(null, created_user); } }) .catch((error) => { const error_to_be_returned = new Error("Error creating user"); return done(error_to_be_returned, null); }); } }) .catch((error) => { const error_to_be_returned = new Error("Error finding user"); return done(error_to_be_returned, null); }); }) );
内容的提问来源于stack exchange,提问作者AG_HIHI
相关产品推荐
相关产品推荐

