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

使用Google OAuth Java库兑换令牌失败:redirect_uri不匹配求助

解决Google OAuth Java客户端的redirect_uri_mismatch问题(已安装应用场景)

看起来你踩了已安装应用(桌面/本地应用)OAuth流程的常见坑——混淆了Web应用和桌面应用的凭证类型,而且授权请求和令牌兑换时的redirect_uri没有严格匹配。我来一步步帮你解决:

1. 确认你用的是「桌面应用」类型的OAuth凭证

首先去Google API控制台的凭证页面,检查你的客户端ID类型:

  • 如果你之前创建的是「Web应用」类型,立刻删掉它,重新创建一个**「桌面应用」(Desktop app)类型的OAuth客户端ID**。
  • 桌面应用的凭证默认就包含urn:ietf:wg:oauth:2.0:oob和http://localhost作为合法的redirect_uri,不需要手动添加或修改——这是桌面应用的特殊待遇,因为它是本地运行的,Google允许任意localhost端口的环回地址。

2. 严格保持授权请求和令牌兑换的redirect_uri一致

你的代码里犯了一个关键错误:生成授权URL时用的是带端口的http://localhost:xxx,但兑换令牌时却写了不带端口的http://localhost,这两个URI被Google视为完全不同的地址,自然会报不匹配错误。

把redirect_uri提取成统一的变量,确保两处完全相同:

// 先获取本地服务器的完整地址,包括端口
String redirectUri = LOCALHOST + r.getPort(); // 比如http://localhost:8080

// 生成授权URL时用这个统一的redirectUri
String url = new AuthorizationCodeRequestUrl(AUTH_URL, CLIENT_ID)
        .setScopes(scopes) // 你的drive.readonly权限没问题
        .setRedirectUri(redirectUri)
        .build();

// 兑换令牌时,必须用完全一样的redirectUri
TokenResponse token = new AuthorizationCodeTokenRequest(
        new NetHttpTransport(),
        JacksonFactory.getDefaultInstance(),
        "https://oauth2.googleapis.com/token",
        CLIENT_ID,
        CLIENT_SECRET,
        authorizationCode, // 用户认证后返回的授权码
        redirectUri // 这里必须和授权请求的地址完全一致!
    )
    .setClientAuthentication(getClientAuth())
    .execute();

3. 备选方案:使用oob模式(无需本地服务器)

如果你不想启动本地服务器监听回调,可以用urn:ietf:wg:oauth:2.0:oob这个特殊的redirect_uri:

  • 生成授权URL时设置redirect_uri为urn:ietf:wg:oauth:2.0:oob
  • 用户在浏览器认证后,Google会显示一个授权码,你的应用需要提供输入框让用户手动粘贴这个码
  • 兑换令牌时,同样把redirect_uri设为urn:ietf:wg:oauth:2.0:oob

4. 最后检查

  • 下载最新的「桌面应用」凭证JSON文件,替换掉项目里的旧文件,确保用的是正确的凭证
  • 清除浏览器的缓存和Cookie,避免残留旧的认证会话信息
  • 确认你的授权码没有过期(授权码只有几分钟的有效期,别放太久再兑换)

这样调整后,应该就能解决redirect_uri不匹配的问题了。

内容的提问来源于stack exchange,提问作者Parker Jones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:02:30