【问题标题】:Google Drive access谷歌云端硬盘访问
【发布时间】:2016-11-21 07:56:21
【问题描述】:

我尝试运行此 Java 代码以列出我的 Google Drive 中的所有文件:

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;

public class Quickstart
{
    /**
     * Application name.
     */
    private static final String APPLICATION_NAME = "Drive API Java Quickstart";

    /**
     * Directory to store user credentials for this application.
     */
    private static final java.io.File DATA_STORE_DIR = new java.io.File(
        System.getProperty("user.home"), ".credentials/drive-java-quickstart");

    /**
     * Global instance of the {@link FileDataStoreFactory}.
     */
    private static FileDataStoreFactory DATA_STORE_FACTORY;

    /**
     * Global instance of the JSON factory.
     */
    private static final JsonFactory JSON_FACTORY
        = JacksonFactory.getDefaultInstance();

    /**
     * Global instance of the HTTP transport.
     */
    private static HttpTransport HTTP_TRANSPORT;

    /**
     * Global instance of the scopes required by this quickstart.
     *
     * If modifying these scopes, delete your previously saved credentials at ~/.credentials/drive-java-quickstart
     */
    private static final List<String> SCOPES = Arrays.asList(DriveScopes.DRIVE_METADATA_READONLY);

    static
    {
        try
        {
            HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
            DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
        }
        catch (Throwable t)
        {
            t.printStackTrace();
            System.exit(1);
        }
    }

    /**
     * Creates an authorized Credential object.
     *
     * @return an authorized Credential object.
     * @throws IOException
     */
    public static Credential authorize() throws IOException
    {
        // Load client secrets.
        InputStream in
            = Quickstart.class.getResourceAsStream("/development-241a19899242.json");
        GoogleClientSecrets clientSecrets
            = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow
            = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
            .setDataStoreFactory(DATA_STORE_FACTORY)
            .setAccessType("offline")
            .build();
        Credential credential = new AuthorizationCodeInstalledApp(
            flow, new LocalServerReceiver()).authorize("user");
        System.out.println(
            "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
        return credential;
    }

    /**
     * Build and return an authorized Drive client service.
     *
     * @return an authorized Drive client service
     * @throws IOException
     */
    public static Drive getDriveService() throws IOException
    {
        Credential credential = authorize();
        return new Drive.Builder(
            HTTP_TRANSPORT, JSON_FACTORY, credential)
            .setApplicationName(APPLICATION_NAME)
            .build();
    }

    public static void main(String[] args) throws IOException
    {
        // Build a new authorized API client service.
        Drive service = getDriveService();

        // Print the names and IDs for up to 10 files.
        FileList result = service.files().list()
            .setPageSize(10)
            .setFields("nextPageToken, files(id, name)")
            .execute();
        List<File> files = result.getFiles();
        if (files == null || files.size() == 0)
        {
            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());
            }
        }
    }
}

当我运行代码时,我被重定向到登录页面以输入我的 Google 电子邮件凭据。我怎样才能跳过这一步? 我将完全在后台使用的代码需要在 JSON 文件中使用凭据。

【问题讨论】:

    标签: java rest google-drive-api


    【解决方案1】:

    您可能需要使用服务帐户和Perform Google Apps Domain-Wide Delegation of Authority 进行检查。

    在企业应用程序中,您可能希望在没有任何手动授权的情况下以编程方式访问用户数据。在 Google Apps 域中,域管理员可以向第三方应用程序授予域范围内访问其用户数据的权限——这称为域范围内的授权。要以这种方式委派权限,域管理员可以使用具有 OAuth 2.0 的服务帐户。

    这是creating a service account的链接:

    授权服务帐户代表域中的用户访问数据有时被称为“将域范围的权限委派给服务帐户”。

    如果您已委派服务帐户的域范围访问权限并且您想模拟用户帐户,请使用 setServiceAccountUser 方法指定用户帐户的电子邮件地址>GoogleCredential 工厂。例如:

    GoogleCredential credential = new GoogleCredential.Builder()
        .setTransport(httpTransport)
        .setJsonFactory(JSON_FACTORY)
        .setServiceAccountId(emailAddress)
        .setServiceAccountPrivateKeyFromP12File(new File("MyProject.p12"))
        .setServiceAccountScopes(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
        .setServiceAccountUser("user@example.com")
        .build();
    

    还有一个关于Google Drive API with a Service Account的教程,它不是Java语言,但我希望这可以帮助你了解如何使用Google Drive和服务帐户。

    您要上传到您个人可以控制的帐户吗?您不需要用户向 Google 进行身份验证。您需要使用的是带有service accountGoogle Drive API

    希望这会有所帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多