Google登录遇TokenError: Bad Request,无法获取用户Profile求助
谷歌OAuth2登录TokenError: Bad Request问题排查
在谷歌登录页面选择与Google Cloud一致的账户后,控制台未打印谷歌返回的用户Profile,反而抛出以下错误:
TokenError: Bad Request at Strategy.OAuth2Strategy.parseErrorResponse (/Users/ /my-blog/api/node_modules/passport-oauth2/lib/strategy.js:373:12) at Strategy.OAuth2Strategy._createOAuthError (/Users/ /my-blog/api/node_modules/passport-oauth2/lib/strategy.js:420:16) at /Users/ /my-blog/api/node_modules/passport-oauth2/lib/strategy.js:177:45 at /Users/ /my-blog/api/node_modules/oauth/lib/oauth2.js:191:18 at passBackControl (/Users/ /my-blog/api/node_modules/oauth/lib/oauth2.js:132:9) at IncomingMessage.<anonymous> (/Users/ /my-blog/api/node_modules/oauth/lib/oauth2.js:157:7) at IncomingMessage.emit (node:events:532:35) at endReadableNT (node:internal/streams/readable:1346:12) at processTicksAndRejections (node:internal/process/task_queues:83:21)
PassportJs配置
const User = require("./models/User"); const mongoose = require("mongoose"); const GoogleStrategy = require("passport-google-oauth20").Strategy; module.exports = function (passport) { passport.use( new GoogleStrategy( { clientID: "", clientSecret: "", callbackURL: "api/auth/google/callback", }, async (accessToken, refreshToken, profile, done) => { console.log(profile) } ) ) passport.serializeUser((user, done) => { done(null, user.id) }) passport.deserializeUser((id, done) => { User.findById(id, (err, user) => done(err, user)) }) }
此处本应在控制台打印谷歌返回的用户Profile!
Auth路由配置
const passport = require("passport"); router.get("/google", passport.authenticate("google", { scope: ["profile"] })) router.get( '/google/callback', passport.authenticate('google', { failureRedirect: '/' }), (req, res) => { res.redirect('/register') } )
主文件index.js配置
const authRoute = require("./routes/auth"); const passport = require ("passport"); // Passport config require('./passport')(passport); const session = require('express-session') // Sessions app.use( session({ secret: 'keyboard cat', resave: false, saveUninitialized: false }) ) // Passport middleware app.use(passport.initialize()); app.use(passport.session()); app.use("/api/auth", authRoute); app.listen("4000", () => { console.log("Backend is running."); });
Google Cloud配置截图

问题修复步骤
修正Callback URL
Passport配置中的callbackURL使用了相对路径,必须改为完整的绝对URL,例如:callbackURL: "http://localhost:4000/api/auth/google/callback"同时确保该URL与Google Cloud OAuth客户端配置中的授权回调URL完全一致,包括协议(http/https)、端口和路径,不能有拼写错误。
填入正确的ClientID和ClientSecret
从Google Cloud的OAuth 2.0客户端详情页复制客户端ID和客户端密钥,填入Passport配置的对应字段:clientID: "你的Google客户端ID", clientSecret: "你的Google客户端密钥",启用必要的API权限
登录Google Cloud控制台,确保已启用People API(获取用户Profile信息依赖此API):- 进入API库,搜索"People API"
- 点击启用按钮
扩展Scope配置(可选)
可以将scope扩展为["profile", "email"],确保获取足够的用户信息权限:router.get("/google", passport.authenticate("google", { scope: ["profile", "email"] }))
完成以上步骤后,重新启动服务,再次尝试谷歌登录,控制台应该能正常打印用户Profile信息。
内容的提问来源于stack exchange,提问作者sultan.h
相关产品推荐
相关产品推荐

