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;
}
谁能告诉我如何在最长时间内保持令牌有效或如何解决上述问题。
您需要了解Oauth2的工作原理,我认为您应该阅读使用OAuth 2.0访问Google API
- 如有必要,刷新访问令牌。
访问令牌的寿命有限。如果您的应用程序需要在单个访问令牌的生存期之外访问Google API,则可以获取刷新令牌。刷新令牌使您的应用程序可以获得新的访问令牌。
注意:将刷新令牌保存在安全的长期存储中,并在它们仍然有效的情况下继续使用它们。限制适用于每个客户端-用户组合以及所有客户端上的每个用户发出的刷新令牌的数量,并且这些限制是不同的。如果您的应用程序请求足够的刷新令牌以超过限制之一,则较旧的刷新令牌将停止工作。
如文档中所述,访问令牌仅在有限的时间内工作。那是1个小时,您无法延长。但是您具有获取新的AccessToken所需的refreshToken。除非用户撤消您的访问权限,否则RefreshTokens不会过期。但是在您的情况下,这不会发生,因为您使用的是服务帐户。这样您就可以重新运行代码并获得一个新的AccessToken
您有两种选择:
第一种选择是最好的,因为google记录了您从API获得的错误数量,而没有理由对您运行会出错的东西。我通常会在我的旧令牌到期前5分钟请求一个新的AccessToken。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句