通过Google OAuth 2.0服务器端访问Google云端硬盘

时间:2018-10-17 19:32:04

标签: spring-boot google-drive-api jhipster google-oauth2 google-oauth-java-client

我创建了一个有权访问特定Google驱动器的用户。通过一个Spring Boot应用程序(jhipster),我将此用户连接到G-Drive。 我的问题是身份验证。我使用此代码来进行身份验证(例如Google为网络应用程序提供的示例):

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
    HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
    .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(".")))
    .setApprovalPrompt("auto")
    .build();
return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");

应用程序第一次启动时,它将尝试查找StoredCredential文件。 如果没有,则Google提供了一个链接供用户在浏览器中打开它:

  

请在浏览器中打开以下地址:
  https://accounts.google.com/o/oauth2/auth?...

由于无法从EC2实例执行此操作,因此请在本地计算机上执行此操作,然后将文件从服务器上载到期望的位置。最终,重新启动使Web服务器可以工作一段时间,直到令牌过期。 之后,我必须执行相同的步骤。

很明显,我在这里做错了。 Web应用程序每隔几分钟连接G-Drive的正确步骤是什么?

更新: 我发现(https://cloud.google.com/storage/docs/authentication)必须使用服务帐户,因为该链接建议用于云存储。不幸的是,我已经为服务帐户下载了json,设置了env变量,但这似乎不适用于google drive rest api(v3)。

谢谢

1 个答案:

答案 0 :(得分:0)

感谢您的输入,但我终于找到了答案。 我从样本中使用了已安装应用程序(独立应用程序)的代码。

我应该使用的是“服务帐户”。 这可以通过普通的Google用户帐户轻松创建。 您将收到一个JSON,并且必须在环境变量GOOGLE_APPLICATION_CREDENTIALS

中设置此json文件的完整路径。

更多信息可以在这里找到:https://developers.google.com/identity/protocols/OAuth2ServiceAccount

拥有GoogleCredential对象后,其余示例代码将保持不变。

编辑: 出于演示目的,我可以使用我在“已安装的应用程序” /“独立应用程序”之前介绍的解决方案,因为在该过程中,用户实际按下将要弹出的链接,并每60分钟左右刷新一次过期的令牌。

正确的解决方案确实是使用服务帐户并模拟父帐户(与您一起创建服务帐户的那个人)。 这是一个示例:

    GoogleCredential credential = new GoogleCredential.Builder()
        .setTransport(HTTP_TRANSPORT)
        .setJsonFactory(GCredentials.JSON_FACTORY)
        .setServiceAccountId("xxxxxx@xyz.iam.gserviceaccount.com")
        .setServiceAccountUser("This is the email of the real user that you want to impersonate")
        .setServiceAccountProjectId("The project ID")
        .setServiceAccountPrivateKeyFromP12File(p12File)
        .setServiceAccountScopes(SCOPES)
        .build();

管理员必须授予您所声明的适当权限(SCOPES),并且必须使用管理控制台上的CLIENT ID来完成。

还必须确保您模拟的帐户是g-drive文件夹的成员。对于服务帐户,这不是必需的。 创建DriveService实例时,项目名称也必须正确。 我希望这对很多人有帮助,避免浪费大量时间尝试成功连接。