【问题标题】:Google OAuth 2.0 server side access to Google DriveGoogle OAuth 2.0 服务器端访问 Google Drive
【发布时间】:2019-03-22 13:45:01
【问题描述】:

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

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)。

谢谢

【问题讨论】:

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


【解决方案1】:

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

我应该使用的是“服务帐户”。 这可以从普通的 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 实例时,项目名称也必须正确。 我希望这可以帮助很多人,避免浪费大量时间尝试成功连接。

【讨论】:

  • 我们需要为此创建一个 g-suite 帐户吗?
  • 嗨@Razebond 虽然我处理这个问题已经有一段时间了,但我记得所有帐户都是 g-suite。