【问题标题】:Receiving INVALID_GRANT on authorization_code request for Google Oauth在 Google Oauth 的 authorization_code 请求中收到 INVALID_GRANT
【发布时间】: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


【解决方案1】:

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

我们对同一请求进行了一些后处​​理(根据该访问令牌从谷歌加载一些数据),似乎如果这需要超过 90 秒,谷歌将重复回调(使用相同的授权代码)。

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

因此,我们案例中的正确答案是: 如果您从 Google 的令牌服务器收到无效授权 - 对 authorization_code 请求的错误请求,那么您可能正在尝试重新使用 authorization_code。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 2013-06-18
    • 2017-12-10
    相关资源
    最近更新 更多