Oauth 2.0 检索用户的Google联系人2-3分钟后出现令牌响应异常
持续1-2分钟后,我收到令牌响应异常。在2-3分钟后,联系人出现,然后在2-3分钟后,再次出现令牌异常。 以下是例外Oauth 2.0 检索用户的Google联系人2-3分钟后出现令牌响应异常,oauth-2.0,google-oauth,google-shared-contacts,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 a
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>
下面是getCredentials()方法
public GoogleCredential getCredentials(){
GoogleCredential凭证=null;
试一试{
集合范围=新的ArrayList();
作用域。添加(“https://www.googleapis.com/auth/userinfo.profile");
作用域。添加(“https://www.google.com/m8/feeds");
HttpTransport HttpTransport=新的NetHttpTransport();
JacksonFactory jsonFactory=新JacksonFactory();
credential=new GoogleCredential.Builder().setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(服务\帐户\电子邮件)
.setServiceAccountScopes(范围)
.setServiceAccountUser(adminEmailAddress)
.setServiceAccountPrivateKeyFromp12文件(新的java.io.File(服务\帐户\ PKCS12\文件\路径))
.build().setExpiresInSeconds(最小值);
credential.refreshtToken();
}捕获(例外e){
e、 printStackTrace();
}
返回凭证;
}
有谁能告诉我如何使令牌在最长时间内保持有效,或者如何处理上述问题吗?您需要了解Oauth2的工作原理,我认为您应该阅读
第一个选择是最好的,因为谷歌会记录你从API中得到的错误数量,没有理由运行会在你身上出错的东西。我通常在旧的AccessToken到期前5分钟请求一个新的AccessToken。当自动验证出现问题时,通常会出现此错误。我不是java专家,但我可以有根据地猜测。首先,我要检查setExpiresInSeconds(min)以及如何将凭据添加到ContactSerivce。GoogleAround看看你是否能找到一个使用GoogleOAuth2和服务帐户的例子。访问令牌有效期为1小时,之后会出现异常。再次,我需要刷新令牌,然后它是工作。还有别的办法吗?如何在用户会话之前保持令牌有效。。?给我一些提示。AccessToken是短期的,它们只在1小时内有效。当第一个accessToken具有exipred时,您需要使用RefreshToken来获取新的accessToken。我设置的accessToken将在24小时内以秒为单位过期,但仍然需要1小时。为什么我无法更改时间,这是使用访问令牌检索联系人的正确方法,还是也有其他方法?请检查下面的anwser,解释作为注释添加的时间太长。我想了解一件事,访问令牌是特定于域或特定于用户的。意味着如果它是特定于域的,那么一个访问令牌将适用于该域中的所有用户如果它是特定于用户的,那么我需要将每个访问令牌带给每个用户。AccessToken和RefreshToken特定于用户/帐户数据。在这种情况下,因为您使用的是服务帐户,它是您的数据。您无法访问其他用户的数据,因此您无需担心。
ContactsService contactService = new ContactsService("appName");
contactService.setOAuth2Credentials(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;
}