google oauth并刷新令牌混乱/问题

时间:2018-11-05 12:50:11

标签: google-oauth google-oauth2 google-oauth-java-client

我曾希望在身份验证过程中而不是在api访问期间刷新过期的访问令牌。

我想我理解为什么会发生这种情况-授权只执行一次,但是访问令牌可以随时过期,因此,只要确定令牌已过期,就需要尝试刷新。

我想确认这是对正在发生的事情的正确解释。

我的第一个线索是docs中所说的部分

  

如果您使用Google API客户端库,则客户端对象会刷新   只要您为该对象配置访问令牌,就可以根据需要访问令牌   离线访问。

我正在使用以下内容:

google-oauth-client 1.24.1
google-oauth-client-java6 1.24.1
google-oauth-client-jetty 1.24.1

当我使用完全无效的访问令牌(“我不好”)和有效的刷新令牌运行时,执行 DCM API对com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient子类的调用,我观察到以下行为:

控制权通过方法:

传递给com.google.api.client.auth.oauth2.Credential
public final boolean refreshToken() throws IOException {
  lock.lock();
    try {
      try {
        TokenResponse tokenResponse = executeRefreshToken();
        if (tokenResponse != null) {
          setFromTokenResponse(tokenResponse);
          for (CredentialRefreshListener refreshListener : refreshListeners) 
          {
            refreshListener.onTokenResponse(this, tokenResponse);
          }
          return true;
        }
      } catch (TokenResponseException e) {
        boolean statusCode4xx = 400 <= e.getStatusCode() && e.getStatusCode() < 500;
        // check if it is a normal error response
        if (e.getDetails() != null && statusCode4xx) {
          // We were unable to get a new access token (e.g. it may have been revoked), we must now
          // indicate that our current token is invalid.
          setAccessToken(null);
          setExpiresInSeconds(null);
        }
        for (CredentialRefreshListener refreshListener : refreshListeners) {
          refreshListener.onTokenErrorResponse(this, e.getDetails());
        }
        if (statusCode4xx) {
          throw e;
        }
      }
    return false;
  } finally {
    lock.unlock();
  }
}

只要刷新令牌有效,它就会消失并获得一个新的访问令牌(我尝试使用无效的刷新令牌并看到它失败了)。

成功获取新的访问令牌后,控制权传递给

refreshListener.onTokenErrorResponse(this, e.getDetails());

将令牌插入适当的对象中,然后继续访问。

如果运行刷新令牌错误,则上述方法将失败,并显示以下信息:

  

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request { "error" : "invalid_grant", "error_description" : "Bad Request" }

任何人都可以确认我有正确的一般想法吗?

0 个答案:

没有答案