Google OAuth2令牌兑换时出现400 Bad Request错误求助
排查OAuth2令牌兑换400 BAD REQUEST的常见原因
以下是针对你遇到问题的具体排查方向,按优先级排序:
1. 核心请求参数与格式校验
Google令牌端点要求**application/x-www-form-urlencoded格式**的请求体,且必须包含完整参数:
- 强制参数:
code、client_id、client_secret、grant_type=authorization_code、redirect_uri - 重点检查
redirect_uri:必须和Google Cloud Console中配置的完全一致(包括HTTP/HTTPS、末尾斜杠、路径拼写),且要和你在OAuth Playground中使用的redirect_uri保持统一 - 如果你用普通
Map作为请求体,RestTemplate不会自动处理表单编码,建议改用MultiValueMap并显式设置请求头:
MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>(); requestBody.add("code", code); requestBody.add("client_id", yourClientId); requestBody.add("client_secret", yourClientSecret); requestBody.add("grant_type", "authorization_code"); requestBody.add("redirect_uri", "http://localhost:8080/auth/google/callback"); // 严格匹配控制台配置 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(requestBody, headers); ResponseEntity<Map> tokenResponse = restTemplate.postForEntity(tokenEndpoint, request, Map.class);
2. 令牌端点URL正确性
确认tokenEndpoint使用Google官方标准地址:https://oauth2.googleapis.com/token,避免使用旧版或非官方变体地址。
3. Client ID/Secret配置校验
- 检查
application.config中的client ID和secret是否与Google Cloud Console里的OAuth 2.0客户端信息完全一致,注意不要包含多余空格、换行或特殊字符 - 确保你的客户端类型是「Web应用」,而非桌面/移动应用——不同类型的客户端权限规则不同
4. Code有效性验证
- OAuth授权码只能被兑换一次,如果你已经在OAuth Playground用过这个code,必须重新生成新的code再测试
- 确保获取code和兑换令牌时使用的是同一个Google账号,且申请的权限范围(scope)一致
5. RestTemplate配置排查
- 检查RestTemplate是否被自定义拦截器修改了请求头或参数(比如添加了不必要的认证信息)
- 开启RestTemplate日志,查看实际发送的请求内容,对比OAuth Playground的请求细节(可通过浏览器开发者工具查看Playground的POST请求):
# application.properties中添加日志配置 logging.level.org.springframework.web.client.RestTemplate=DEBUG
6. Postman调用验证
直接在Postman中向Google令牌端点发送POST请求,带上所有正确参数,确认是否能正常获取令牌。如果可以,说明问题出在你的接口代码逻辑;如果不行,再检查参数或账号配置。
内容的提问来源于stack exchange,提问作者user30039244
相关产品推荐
相关产品推荐

