云端硬盘API:更改所有者时权限不足

时间:2018-07-26 03:30:52

标签: java google-drive-api

我用Java编写了一个程序,该程序会生成一个包含VEX团队统计信息的电子表格。我的总体目标是使程序本质上能够生成电子表格并将该工作表的所有权更改为特定的电子邮件。表格功能可以完全正常工作,能够轻松创建和修改电子表格值(使用表格API)。问题是,当我尝试使用Drive API更改文件的所有权时,在运行Drive.permissions().create时收到“权限不足”消息。

在使用API​​资源管理器并对其进行自我测试时,我能够转让电子表格的所有权,但是我无法在Java中完成。

这是我创建Google凭据的方式:

private void setCredential() throws GeneralSecurityException, IOException {
        //Create new transport
        HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
        //Build authenticated credential
        GoogleCredential credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(jsonFactory)
                .setClientSecrets(Constants.GOOGLE_CLIENT_ID,
                                  Constants.GOOGLE_CLIENT_SECRET)
                .build();
        credential.setAccessToken(this.accessToken)
                  .setRefreshToken(Constants.GOOGLE_REFRESH_TOKEN);
        //Set class field
        this.credential = credential;
}

我注意到这里没有任何实际范围(这很奇怪,因为当Sheets API正常工作时此凭据仍然有效),在这里我一直在寻找如何在此处输入适当范围的方法,但没有发现任何问题。我不知道这是我的程序错误的原因,还是其他原因。

这就是我所说的转移所有权的方法:

private void transferOwnership(Drive driveService) throws IOException {
        //Print message
        System.out.printf("Transferring ownership to %s", this.usrEmail);
        //Build request body
        Permission body = new Permission()
                .setRole("owner")
                .setType("user")
                .setEmailAddress(this.usrEmail);
        //Execute Drive request
        Permission permission = driveService.permissions().create(this.spreadsheetId, body)
                .setFileId(this.spreadsheetId)
                .setEmailMessage("Test - Replace with something")
                .setSendNotificationEmail(true)
                .setSupportsTeamDrives(true)
                .setTransferOwnership(true)
                .setUseDomainAdminAccess(false)
                .setFields("emailAddress")
                .execute();
        //Print message
        System.out.printf("Ownership successfully transferred to %s", this.usrEmail);
}

这些是我的问题:

  • 我建立的凭证错误吗?如果是这样,我应该如何正确构建它?
  • 我需要提供两个不同的凭据吗?(一个用于Sheets API,一个用于Drive API)
  • 即使未定义范围,我的凭据也如何与Sheets API配合使用,但不适用于Drive API

编辑:The way I use the APIs explorer to change ownership

编辑2:这就是我获取访问令牌的方式。至于刷新令牌,我使用了Google的Oauth Playground。

public void setAccessToken() throws IOException, GeneralSecurityException{
        //Create a token response using refresh token and oauth credentials
        this.token_response = new GoogleRefreshTokenRequest(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), 
                Constants.GOOGLE_REFRESH_TOKEN, Constants.GOOGLE_CLIENT_ID, Constants.GOOGLE_CLIENT_SECRET)
                .execute();
        //Set the access token
        this.accessToken = token_response.getAccessToken();   
    }

0 个答案:

没有答案