简体   繁体   English

Google云端硬盘访问

[英]Google Drive access

I tried to run this Java code in order to list all files in my Google Drive: 我试图运行此Java代码以列出Google云端硬盘中的所有文件:

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

When I run the code I'm redirected to login page to enter my Google's e-mail credentials. 运行代码时,我将重定向到登录页面以输入Google的电子邮件凭据。 How I can skip this step? 如何跳过此步骤? The code I will entirely in background I need to use the credentials in a JSON file. 我将完全在后台使用的代码需要使用JSON文件中的凭据。

You might want to check using a service account and Perform Google Apps Domain-Wide Delegation of Authority . 您可能要检查使用服务帐户,然后执行“执行Google Apps域范围内的授权”

In enterprise applications you may want to programmatically access users data without any manual authorization on their part. 在企业应用程序中,您可能需要以编程方式访问用户数据,而无需他们的任何手动授权。 In Google Apps domains, the domain administrator can grant to third party applications domain-wide access to its users' data — this is referred as domain-wide delegation of authority. 在Google Apps域中,域管理员可以向第三方应用程序授予其用户数据的域范围访问权限-这称为域范围的授权。 To delegate authority this way, domain administrators can use service accounts with OAuth 2.0. 为了以这种方式委派权限,域管理员可以将服务帐户与OAuth 2.0结合使用。

Here is the link for creating a service account : 这是用于创建服务帐户的链接:

Authorizing a service account to access data on behalf of users in a domain is sometimes referred to as "delegating domain-wide authority" to a service account. 授权服务帐户代表域中的用户访问数据有时称为“将域范围的权限委派给服务帐户”。

And if you have delegated domain-wide access to the service account and you want to impersonate a user account, specify the email address of the user account with the setServiceAccountUser method of the GoogleCredential factory. 并且,如果您已将服务帐户委派给域范围的访问权限,并且要模拟用户帐户,请使用GoogleCredential工厂的setServiceAccountUser方法指定该用户帐户的电子邮件地址。 For example: 例如:

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

There is also a tutorial about Google Drive API with a Service Account , it is not in Java but I hope this helps you understand how to use Google Drive and service account. 还有一个有关带有服务帐户的Google Drive API的教程,它不是Java语言,但希望这可以帮助您了解如何使用Google Drive和服务帐户。

Do you want to upload to an account that you personally have control of? 您想上传到您个人控制的帐户吗? You don't need the users to authenticate themselves with Google. 您不需要用户通过Google进行身份验证。 What you need to use is the Google Drive API with a service account . 您需要使用带有服务帐户Google Drive API

Hope this helps. 希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM