Oauth 2.0 检索用户的Google联系人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

持续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>
下面是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的工作原理,我认为您应该阅读

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

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

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

    您有两个选择:

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

  • 第一个选择是最好的,因为谷歌会记录你从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;
    }