对Google Oauth的authorization_code请求接收INVALID_GRANT



我们正在使用OAuth2来访问客户端的access_token来管理他们的一些Google位置。

我们的实现对于大多数客户端都工作良好,但是当发送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

我们要求用户尝试多次,首先从授权帐户中删除我们的应用程序,但他们仍然收到invalid_grant响应。当同一公司的另一个用户想要授权我们使用相同的位置时,也会出现这个问题。

编辑更多细节:

我们正在使用spring-social从授权代码中获取访问令牌(我知道它是EOL,我们只使用了它的一小部分)。

我们自己的代码:
final OAuth2ConnectionFactory<T> connectionFactory = (OAuth2ConnectionFactory<T>) this.connectionFactoryLocator
.getConnectionFactory();
final String callbackUrl = "...";
// This is the failing call
final AccessGrant accessGrant = connectionFactory.getOAuthOperations().exchangeForAccess(code, callbackUrl, null);

库的相关部分调用:

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);

经过进一步的调查,invalid_grant响应在我们的案例中是一个转移注意力的问题。

我们对相同的请求进行了一些后处理(基于该访问令牌从Google加载一些数据),并且似乎如果这需要超过~90秒,Google将重复回调(使用相同的authorization_code)。

这导致我们试图重用授权码-这导致我们的日志中的错误响应。

所以,在我们的例子中,正确的答案是:如果您从Google的令牌服务器接收到一个authorization_code请求的invalid_grant - Bad Request,那么您可能正在尝试重用authorization_code。

最新更新