使用PassportJS完成Google OAuth认证后无法正常重定向的问题排查请求
嘿,我帮你排查出了几个关键问题,尤其是导致重定向卡住的核心bug,咱们一步步来修复:
1. 最致命的变量错误(直接导致卡住)
看你代码里的用户存在分支:
} else { console.log('exists') return cb(null, newUser); }
这里你返回了newUser,但这个变量只在新用户的分支里定义过!已存在的用户应该用你查询到的user[0]才对。Passport拿到undefined的用户对象后,根本没法完成认证流程,自然就卡在加载状态了。
修改后的这段代码应该是:
} else { console.log('exists') return cb(null, user[0]); // 改用查询到的已存在用户 }
2. 回调URL必须完全匹配
你代码里的callbackURL写的是https://no cuz privacy/auth/google,实际部署时必须和Google Cloud Console里配置的授权重定向URI完全一致——包括协议(http/https)、域名、路径,连一个字符都不能错。如果这里不匹配,Google会直接拒绝回调请求,流程也会卡住。
3. Session配置的注意事项
你在/auth/google的路由里设置了session: false,这意味着Passport不会创建会话来保存用户状态。如果你的应用需要让用户保持登录,建议去掉这个选项(默认是true);如果是用无session的token认证,那后续要自己处理用户状态的存储。
4. 补上异步操作的错误处理
你的代码里没有捕获User.find或newUser.save这类异步操作可能抛出的错误,一旦数据库操作失败,错误没有传递给Passport,也会导致流程挂起。建议用try/catch包裹整个逻辑:
async function(issuer, profile, cb) { try { var user = await User.find({ google: true, googleid: profile.id }) if (!user[0]) { const newUser = await new User({ username: generateUsername(), google: true, googleid: profile.id, googleProfile: profile }) await newUser.save() return cb(null, newUser); } else { console.log('exists') return cb(null, user[0]); } } catch (err) { return cb(err); // 将错误传递给Passport处理 } }
关于cb和done的小说明
你提到的cb和done只是参数名不同,功能完全一样——都是Passport策略用来传递认证结果的回调函数,叫什么名字都可以,不用纠结这个。
把这些修改完之后,重启服务再测试一下,应该就能正常完成Google认证并重定向到首页了!
内容的提问来源于stack exchange,提问作者Spacehold

