Google云端硬盘的正确授权方式是什么?

时间:2015-10-22 18:11:46

标签: java google-drive-api

我想将Google云端硬盘集成到我们的网络应用程序中。因此,每个用户都可以将他的Google云端硬盘存储空间连接到我们的应用程为此目的,正确的授权方式是什么?

OAuth正确吗?我知道要在开发者控制台中创建凭据,但如何将google凭据与我们的帐户相关联,存储并在以后上传文件时使用?

我希望在OAuth登录后与用户的云端硬盘写入/读取文件。

这是我的代码,它使用的是服务凭据。我知道这是错误的方式。

public class GDManager {

    private static String accountId = "xxx@developer.gserviceaccount.com";
    private static String p12File = "file.p12";

    private static GoogleCredential buildCredential(HttpTransport httpTransport, JsonFactory jsonFactory) throws GeneralSecurityException, IOException {
        // Build service account credential.
        return new GoogleCredential.Builder().setTransport(httpTransport)
                .setJsonFactory(jsonFactory)
                .setServiceAccountId(accountId)
                .setServiceAccountScopes(Collections.singleton(DriveScopes.DRIVE))
                .setServiceAccountPrivateKeyFromP12File(new java.io.File(GDManager.class.getClassLoader().getResource(p12File).getFile()))
                .build();
    }

    private static Drive init() {
        try {
            HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
            JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
            GoogleCredential credential = buildCredential(httpTransport, jsonFactory);

            return new Drive.Builder(
                    httpTransport, jsonFactory, credential)
                    .setApplicationName("Google drive test")
                    .build();

        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    public static void main(String[] args) throws IOException {
        Drive service = init();

        String parentId = null;
        String mimeType = "text/plain";

        File body = new File();
        body.setTitle("test");
        body.setDescription("description");
        body.setMimeType(mimeType);

        if (parentId != null && parentId.length() > 0) {
            body.setParents(
                    Arrays.asList(new ParentReference().setId(parentId)));
        }

        java.io.File fileContent = new java.io.File("/home/michal/Downloads/google_drive");
        FileContent mediaContent = new FileContent(mimeType, fileContent);
        try {
            File file = service.files().insert(body, mediaContent).execute();
            System.out.println(file);
        } catch (IOException e) {
            System.out.println("An error occured: " + e);
        }
    }

}

1 个答案:

答案 0 :(得分:1)

您无法通过静态主方法对此进行测试,您需要将其集成到Web应用程序中。 OAuth身份验证要求您将用户的浏览器会话重定向到Google云端硬盘网址以进行授权。请查看此页面,了解如何执行此操作:https://developers.google.com/drive/web/credentials?hl=en。请注意,当您在未经授权的情况下调用getCredentials时,会抛出异常并且这包含您必须将用户的浏览器重定向到的授权URL才能获取授权代码,然后您可以使用该代码交换访问令牌,然后您可以使用访问Google云端硬盘上的文件。