Google OAuth 2.0 服务器端访问 Google 驱动器

Google OAuth 2.0 server side access to Google Drive

我创建了一个可以访问特定 google 驱动器的用户。通过 Spring 引导应用程序 (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 提供 link 供用户在其浏览器中打开它:

Please open the following address in your browser:
https://accounts.google.com/o/oauth2/auth?...

由于我无法从 EC2 实例执行此操作,因此我在本地计算机上执行此操作,并将文件上传到服务器的预期位置。最后,重新启动会使 Web 服务器工作一段时间,直到令牌过期。 之后我必须做同样的程序。

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

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

谢谢

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

我应该使用 "service account"。 这可以从普通 Google 用户帐户轻松创建。 您将收到一个 JSON,您必须在环境变量 GOOGLE_APPLICATION_CREDENTIALS

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

可在此处找到更多信息:https://developers.google.com/identity/protocols/OAuth2ServiceAccount

一旦您有了 GoogleCredential 对象,示例代码的其余部分将保持不变。

编辑: 使用我之前描述的解决方案 "Installed Application"/"Standalone application" 可以用于演示目的,其中用户实际按下将弹出的 link 以刷新过期每 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 实例时,项目名称也必须正确。 我希望这能帮助很多人,避免浪费大量时间尝试连接成功。