0

我连续 1-2 分钟后收到令牌响应异常。在 2-3 分钟后联系到来,然后在 2-3 分钟后再次出现令牌异常。下面是例外

com.google.api.client.auth.oauth2.TokenResponseException: 403 OK

<p class="large"><b>403.</b> 
<ins>That's an error.</ins></p><p class="large">You are not authorised to perform this request.  <ins>That's all we know.</ins>
</p>

我正在检索用户的联系人,下面是我的代码,

 ContactsService contactService = new ContactsService("appName");
 contactService.setOAuth2Credentials(getCredentials());

下面是 getCredentials() 方法。

public  GoogleCredential getCredentials()  {
    GoogleCredential credential = null;
    try{

         Collection<String> SCOPES = new ArrayList<String>();
         SCOPES.add("https://www.googleapis.com/auth/userinfo.profile");
         SCOPES.add("https://www.google.com/m8/feeds");
         HttpTransport httpTransport = new NetHttpTransport();
         JacksonFactory jsonFactory = new JacksonFactory();
         credential = new GoogleCredential.Builder().setTransport(httpTransport)
                .setJsonFactory(jsonFactory)
                .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
                .setServiceAccountScopes(SCOPES)
                .setServiceAccountUser(adminEmailAddress)
                .setServiceAccountPrivateKeyFromP12File(new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
                .build().setExpiresInSeconds(min);

         credential.refreshToken();

    } catch(Exception e){
        e.printStackTrace();
    }
    return credential;
}

谁能告诉我如何让令牌在最长时间内有效或如何处理上述问题。?

4

1 回答 1

1

您需要了解 Oauth2 的工作原理 我认为您应该阅读 Using OAuth 2.0 to Access Google APIs

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

访问令牌的生命周期有限。如果您的应用程序需要在单个访问令牌的生命周期之外访问 Google API,它可以获得刷新令牌。刷新令牌允许您的应用程序获取新的访问令牌。

注意:将刷新令牌保存在安全的长期存储中,只要它们仍然有效,就可以继续使用它们。限制适用于每个客户端-用户组合以及所有客户端的每个用户发出的刷新令牌的数量,这些限制是不同的。如果您的应用程序请求足够的刷新令牌以超过其中一个限制,则较旧的刷新令牌将停止工作。

如文档中所述,访问令牌的工作时间有限。那是1小时,您不能延长。但是您拥有获取新 AccessToken 所需的 refreshToken。除非用户撤销您的访问权限,否则 RefreshTokens 不会过期。但在您的情况下,这不会发生,因为您使用的是服务帐户。所以你可以重新运行你的代码并获得一个新的 AccessToken

你有两个选择:

  1. 如果您的访问令牌即将过期,请检查返回的时间,然后重新运行代码并获取新代码。
  2. 等到您收到错误消息,然后请求新的访问令牌。

第一个选项是最好的,因为 google 会记录您从 API 获得的错误数量,没有理由运行会在您身上出错的东西。我通常会在旧的 AccessToken 到期前 5 分钟申请一个新的 AccessToken。

于 2014-02-11T08:56:29.773 回答