You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置截图

Google Cloud配置截图


问题修复步骤

  1. 修正Callback URL
    Passport配置中的callbackURL使用了相对路径,必须改为完整的绝对URL,例如:

    callbackURL: "http://localhost:4000/api/auth/google/callback"
    

    同时确保该URL与Google Cloud OAuth客户端配置中的授权回调URL完全一致,包括协议(http/https)、端口和路径,不能有拼写错误。

  2. 填入正确的ClientID和ClientSecret
    从Google Cloud的OAuth 2.0客户端详情页复制客户端ID和客户端密钥,填入Passport配置的对应字段:

    clientID: "你的Google客户端ID",
    clientSecret: "你的Google客户端密钥",
    
  3. 启用必要的API权限
    登录Google Cloud控制台,确保已启用People API(获取用户Profile信息依赖此API):

    • 进入API库,搜索"People API"
    • 点击启用按钮
  4. 扩展Scope配置(可选)
    可以将scope扩展为["profile", "email"],确保获取足够的用户信息权限:

    router.get("/google", passport.authenticate("google", { scope: ["profile", "email"] }))
    

完成以上步骤后,重新启动服务,再次尝试谷歌登录,控制台应该能正常打印用户Profile信息。

内容的提问来源于stack exchange,提问作者sultan.h

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:36:28