DCM / DFA报告API和刷新令牌

时间:2018-10-26 11:54:04

标签: google-oauth

Google OAuth2 docs

在刷新令牌下显示:

  
      
  1. 如有必要,刷新访问令牌。
  2.   
     

访问令牌具有有限的生存期。如果您的应用程序需要在单个访问令牌的生存期之外访问Google API,则可以获取刷新令牌。刷新令牌使您的应用程序可以获得新的访问令牌。

我怎么知道此用例是否适用于我的应用?

我正在访问DCM / DFA数据,不确定是否需要担心刷新访问令牌。

编辑pinoyyid

pinoyyid提到刷新令牌。

在DCM示例应用中,此代码(com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp)

public Credential authorize(String userId) throws IOException {
try {
  Credential credential = flow.loadCredential(userId);
  if (credential != null
      && (credential.getRefreshToken() != null || 
          credential.getExpiresInSeconds() == null || 
          credential.getExpiresInSeconds() > 60)) {
    return credential;
  }
  // open in browser
  String redirectUri = receiver.getRedirectUri();

似乎要说,只要您拥有非null的刷新令牌,就可以通过身份验证。

我能够将我的刷新令牌替换为垃圾字符串,并且仍然可以访问。

这似乎是错的。有什么方法可以验证刷新令牌还是不必要?

对pinoyyid的最终编辑:

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

我的第一个线索是文档(https://developers.google.com/identity/protocols/OAuth2WebServer#offline)中所说的部分

“如果您使用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 个答案:

没有答案