检索用户的Google通讯录2-3分钟后的令牌响应异常

时间:2014-02-10 12:11:34

标签: oauth-2.0 google-oauth google-shared-contacts

我连续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;
}

任何人都可以告诉我如何保持令牌有效最长时间或如何处理上述问题。?

1 个答案:

答案 0 :(得分:1)

你需要了解Oauth2是如何工作的,我认为你应该阅读      Using OAuth 2.0 to Access Google APIs

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

    访问令牌的生命周期有限。如果您的应用需要访问权限   对于超出单一访问令牌生命周期的Google API,它可以   获取刷新令牌。刷新令牌允许您的应用程序   获得新的访问令牌。

         

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

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

您有两种选择:

  1. 如果访问令牌即将过期,请检查返回的时间,然后重新运行代码并获取新代码。
  2. 等到收到错误消息然后请求新的访问令牌。
  3. 第一个选项是最好的,因为谷歌记录你从API获得的错误数量没有理由运行会对你造成错误的东西。我通常在旧的AccessToken到期前5分钟请求新的AccessToken。