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

Google OAuth授权码请求返回invalid_grant错误排查求助

Google OAuth2授权码兑换access_token返回invalid_grant错误

我们通过OAuth2获取客户的access_token以管理其Google Locations,多数客户操作正常,但部分用户在发送authorization_code请求时收到以下错误响应:

{  
  "error": "invalid_grant",  
  "error_description": "Bad Request"
}

已知refresh_token请求出现该错误有诸多诱因,但不清楚初始authorization_code请求触发此错误的具体原因。

相关服务地址:

  • 授权服务器URL:https://accounts.google.com/o/oauth2/auth
  • 令牌服务器URL:https://oauth2.googleapis.com/token

已让用户多次尝试(先移除授权账户),但问题依旧;同公司其他用户授权同一Locations时也遇到相同问题。


补充细节

我们使用已停止维护的spring-social框架,仅用其一小部分功能实现授权码兑换access_token。

自有业务代码

final OAuth2ConnectionFactory<T> connectionFactory = (OAuth2ConnectionFactory<T>) this.connectionFactoryLocator
                    .getConnectionFactory();
final String callbackUrl = "...";
// 此处调用失败
final AccessGrant accessGrant = connectionFactory.getOAuthOperations().exchangeForAccess(code, callbackUrl, null);

spring-social库核心调用代码

public AccessGrant exchangeForAccess(String authorizationCode, String redirectUri, MultiValueMap<String, String> additionalParameters) {
    MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
    if (useParametersForClientAuthentication) {
        params.set("client_id", clientId);
        params.set("client_secret", clientSecret);
    }
    params.set("code", authorizationCode);
    params.set("redirect_uri", redirectUri);
    params.set("grant_type", "authorization_code");
    if (additionalParameters != null) {
        params.putAll(additionalParameters);
    }
    return postForAccessGrant(accessTokenUrl, params);
}

protected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {
    Map<String, Object> result = getRestTemplate().postForObject(accessTokenUrl, parameters, Map.class);
    if (result == null) {
        throw new RestClientException("access token endpoint returned empty result");
    }
    return extractAccessGrant(result);
}

OAuth2Template配置代码

final OAuth2Template oAuth2Template = new OAuth2Template(config.getClientId(), config.getClientSecret(),
                GoogleOAuthConstants.AUTHORIZATION_SERVER_URL, GoogleOAuthConstants.TOKEN_SERVER_URL);
oAuth2Template.setUseParametersForClientAuthentication(true);

内容的提问来源于stack exchange,提问作者Adam Szabo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:25:29