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

