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 实例时,项目名称也必须正确。
我希望这能帮助很多人,避免浪费大量时间尝试连接成功。
我创建了一个可以访问特定 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 实例时,项目名称也必须正确。 我希望这能帮助很多人,避免浪费大量时间尝试连接成功。