【发布时间】:2023-01-17 23:21:02
【问题描述】:
我们正在使用 OAuth2 来访问客户的 access_token 以管理他们的一些 Google 位置。
我们的实施对于我们的大多数客户来说工作正常,但是有一个用户在发送 authorization_code 请求时收到以下响应:
{ "error": "invalid_grant", "error_description": "Bad Request"}
我看到有很多原因我们可以为refresh_token请求收到这个,但是为什么我们可以为初始authorization_code请求收到这个?
我们的授权服务器网址:https://accounts.google.com/o/oauth2/auth
令牌服务器网址: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 列出的最明显的原因
-
这是完整的响应:{ "error": "invalid_grant", "error_description": "Bad Request"}。而且我们说的不是refresh_token,而是authorization_code授权类型(所以初始Oauth2授权)
-
您使用的是什么类型的客户端凭据?
-
打赌它的格式是 LinkedMultiValueMap<String> parms 应该是在帖子正文中应用的 http 查询字符串
标签: google-oauth