使用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
相关产品推荐
相关产品推荐

