当前位置: 首页 > 知识库问答 >
问题:

Google Drive API、Oauth和服务帐户

程振濂
2023-03-14

我对Google Drive API、服务帐户和身份验证有一些问题。我读了很多书,但我不知道如何解决这个问题。

上下文:我的驱动器帐户上有一些文件(约35GB)和一个简单的web应用程序,用户可以登录,从我的驱动器中查看一些选定的文件夹/文件,并在需要时下载它们。唯一可以直接访问我的驱动器帐户的人是(或应该是)我的服务器,用户通过web app/server完成他们的工作。

经过一番搜索,我发现服务器到服务器的授权文档对于我来说应该是完美的,但正如我所见,服务帐户并没有共享相同的驱动器空间:它们有自己的驱动器空间,并且不可升级。由于这个(奇怪的)限制,我不能使用服务帐户,因为我有超过35GB的容量,我需要“共享”所有东西。

其他方法:使用“标准”OAuth获取访问令牌,然后使用它调用驱动API,但访问令牌有一个过期日期,我不能每次手动更新它。

那么,第一个问题:有没有办法提高服务号的额度?如果没有,如果有办法使用我的“正常”账户(所有者),就像一个服务号?

第二个(虚拟)问题:我阅读了有关创建新OAuth凭据的文档,最后您获得了一些示例代码和“客户机机密”JSON。我运行了这个示例,但我不明白JSON文件的作用是什么:无论如何,我必须登录并授予权限,为什么我需要它?

第三个(足够愚蠢)问题:如果OAuth是唯一的解决方案,有没有一种方法可以获得/刷新访问令牌,而无需每次手动操作?我查看了OAuth文档,“用户交互/确认”是身份验证流程中的基本内容之一,所以我认为这是不可能的。

共有2个答案

燕志学
2023-03-14

如果你的账户是私人账户,而不是谷歌工作区(以前称为GSuite)的一部分,那么DrinkMystry的答案是正确的。否则,有一种更优雅的方法可以通过createDelegate()方法解决这个问题。这里已经描述过了,您应该遵循这里的所有配置说明,但是这里提供的代码示例基于一些不推荐的软件包,所以我花了一些时间,结合Drive API教程中的代码使其正常工作。

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

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());
            }
        }
    }
}

请确保您的项目依赖项是最新的(不要盲目使用Drive API教程中的依赖项)。这是我的身材。格雷德尔:

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'
}

欧阳安阳
2023-03-14

将驱动器帐户的文件夹共享到服务帐户
您的服务帐户地址如下所示XXX@XXX.iam.gserviceaccount.com.
然后,您的服务帐户可以从驱动器帐户中查看共享文件夹
所以你有35GB的服务帐户。

 类似资料:
  • 我正在尝试将Gmail API与Python Google客户端库结合使用。 我已经通过Google开发者控制台创建了服务帐户凭据。 然后我尝试使用这些凭证,如下所示: 但是,当我尝试使用实际的Gmail API时,我得到一个HTTP 500错误: 一位用户在这里提到,显然“服务账户”不支持使用GMail应用编程接口: https://stackoverflow.com/a/24645874/13

  • 谷歌推荐的方法是什么?如何最好地获得谷歌驱动器帐户的访问权,同时只需要所有者一次性验证,但允许他们随时撤销访问权?

  • 我正在使用谷歌服务帐户将MySQL备份从我们的网络服务器推送到谷歌云端硬盘,使用谷歌API PHP客户端脚本设置为cron作业。 我现在想在多个网络服务器上运行相同的脚本,我不知道如何正确配置服务号,应该吗? > 是否在所有服务器上使用相同的服务帐户和服务帐户密钥/凭据? 或者使用相同的服务帐户,但为每个服务器添加服务帐户密钥/凭据? 还是为每台服务器设置单独的服务帐户?

  • 我正在尝试通过服务帐户(客户端电子邮件和p12证书)连接到google doubeclick api,使用python客户端库,如以下示例所示: http://code.google.com/p/google-api-python-client/source/browse/samples/service_account/tasks.py 它给我一个空access_token: 这有什么意义?我有没

  • 我想用gmail API阅读我的gmail收件箱。我需要使用服务帐户,因为我的应用程序没有用户交互。我在请求时收到以下错误: 这是我的代码: 我做错了什么?有人能帮我吗? 当做

  • 我为我的帐户name@steelkiwi.com(谷歌应用程序)创建了服务帐户,我的应用程序运行良好。然后我为我的个人帐户name@gmail.com创建了服务帐户,为我的应用程序使用这个新的凭据,现在当我试图插入文件时,我得到错误500和下一个文本: HttpError 500请求https://www.googleapis.com/upload/drive/v2/files时?quotause