Google Drive API,Oauth和服务帐户

11 google-drive-api google-oauth service-accounts

我在使用Google Drive API,服务帐户和身份验证时遇到了一些问题.我读了很多,但我无法弄清楚如何解决这个问题.

上下文:我的云端硬盘帐户上有一些文件(约35GB)和一个简单的网络应用程序,用户可以登录,查看我的驱动器中的一些选定的文件夹/文件,并在需要时下载它们.唯一可以直接访问我的云端硬盘帐户的是(或应该是)我的服务器,用户通过网络应用/服务器进行操作.

经过一番搜索,我找到了服务器到服务器的授权文档,这些文档应该是完美的,但我可以看到,服务帐户不共享相同的驱动器空间:它们有自己的,并且不可升级.由于这个(奇怪的)限制我不能使用服务帐户,因为我有超过35GB,我需要"分享"一切.

其他方式:使用"标准"OAuth以获取访问令牌,然后使用它来调用Drive API,但访问令牌有一个过期日期,我无法每次手动更新它.

所以,第一个问题:有没有办法增加服务帐户的配额?如果没有,是否有办法使用我的"普通"帐户(所有者)充当服务帐户?

第二个(虚拟)问题:我阅读了有关创建新OAuth凭据的文档,最后您获得了一些示例代码和"client-secret"JSON.我运行示例但我不明白该JSON文件的作用是什么:我必须登录并给予许可,我为什么需要它?

第三个(虚拟的)问题:如果OAuth是唯一的解决方案,是否有办法获取/刷新访问令牌而不是每次都手动执行?我查看了OAuth文档,"用户交互/确认"是auth流程中的基本内容之一,所以我认为不可能.

小智 27

将您的云端硬盘帐户的文件夹共享到您的服务帐户.
您的服务帐户地址类似于XXX@XXX.iam.gserviceaccount.com.
然后,您的服务帐户可以看到云端硬盘帐户中的共享文件夹.
所以你有35GB的服务帐户.

  • 这个这个这个!!!!!!哇。我费尽心思浏览了很多 Stackoverflow 帖子……直到这篇文章。你救了我!非常感谢@drinkmystery。我欠你的情。 (6认同)
  • 这是正确的答案! (3认同)
  • 伙计,这个答案真的对我有帮助。我非常讨厌 Google 云端硬盘,因为它让我的生活变得悲惨 (2认同)
  • 感谢您的见解。这非常有帮助,因为快速入门页面没有提到这种方法,至少据我所知。 (2认同)

Ser*_*kov 7

如果您的帐户是私人帐户而不是 Google Workspace(以前称为 GSuite)的一部分,那么 Drinkmystery的答案是正确的方法。否则,有一个更优雅的方法来解决这个createDelegated()方法。它在此处进行了描述,您应该遵循那里的所有配置说明,但是那里提供的代码示例基于一些已弃用的软件包,因此我花了一些时间与Drive API 教程中的代码相结合才能使其正常工作

所以对于那些只需要一个工作代码示例的人来说,这里是(注意使用createDelegated):

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.FileList;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.ServiceAccountCredentials;

import java.io.FileInputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Arrays;
import java.util.List;

public class DelegatedDriveWithServiceAccountQuickstart {
    private static final String APPLICATION_NAME = "your awesome app";
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

    private static final List<String> SCOPES = Arrays.asList(DriveScopes.DRIVE);
    private static final String CREDENTIALS_FILE_PATH = "/path/to/your/service-account-key-downloaded-from-google-api-console.json";

    public static void main(String... args) throws IOException, GeneralSecurityException {
        // Build a new authorized API client service
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(ServiceAccountCredentials.fromStream(new FileInputStream(CREDENTIALS_FILE_PATH))
                .createScoped(SCOPES)
                .createDelegated("user.whose.drive.you.want.to.share@your-domain-in-gsuite.com"));
        Drive driveService = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer)
                .setApplicationName(APPLICATION_NAME)
                .build();

        // Print the names and IDs for up to 10 files.
        FileList result = driveService.files().list()
                .setPageSize(10)
                .setFields("nextPageToken, files(id, name)")
                .execute();
        List<File> files = result.getFiles();
        if (files == null || files.isEmpty()) {
            System.out.println("No files found.");
        } else {
            System.out.println("Files:");
            for (File file : files) {
                System.out.printf("%s (%s)\n", file.getName(), file.getId());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请确保您的项目依赖项是最新的(不要盲目使用 Drive API 教程中的那些)。这是我的 build.gradle:

apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'DelegatedDriveWithServiceAccountQuickstart'
sourceCompatibility = 1.8
targetCompatibility = 1.8
version = '1.0'

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.google.api-client:google-api-client:1.31.1'
    compile 'com.google.apis:google-api-services-drive:v3-rev20201130-1.31.0'
    compile 'com.google.auth:google-auth-library-oauth2-http:0.22.2'
}

Run Code Online (Sandbox Code Playgroud)