Android Google Drive Rest API:跳过同意屏幕(硬编码帐户)
Android Google Drive Rest API: skip consent screen (hardcoded account)
我正在尝试使用 Google Drive 来同步一些媒体文件 (video/images) 并在我的 android 应用程序中显示它们。
我已经设法使它一切正常但是根据文档(或者至少从第一次阅读来看)看起来必须总是是一个同意屏幕,用户在选择他的 google 帐户后同意该应用从他的驱动器获取数据。
关键是我想 'hardcode' 一个以编程方式同意的帐户,因为我们的应用程序总是从同一帐户获取媒体。
这可能吗??
PD:不建议任何其他存储服务,Drive 是客户的要求。
为避免用户同意,您可以使用 Service Account。
在 link 中声明,Google API 预测 API 和 Google 云存储可以代表您无需访问用户信息的应用程序。在这些情况下,您的应用程序需要向 API 证明自己的身份,但 不需要用户同意 。同样,在企业场景中,您的应用程序可以请求对某些资源的委托访问。
对于这些类型的服务器到服务器交互,您需要一个 service account,这是一个属于您的应用程序而不是单个最终用户的帐户。您的应用程序代表服务帐户调用 Google APIs,并且 不需要用户同意。 (在非服务帐户场景中,您的应用程序代表最终用户调用 Google APIs,有时需要用户同意。)
您还可以查看此相关的 SO 问题以获取更多信息。
How to use Google Drive SDK in Android project with hardcoded credentials
Why does Google OAuth2 re-ask user for permission when i send them to auth url again
最后我设法让它完全正常工作:
- 从您的 google 开发者控制台创建一个 服务帐户凭据。
- 以 json 格式下载您的凭证。
- 将文件复制到assets/res/raw.
- 将您的 json 重命名为没有奇怪字符的名称(例如:driveserviceprivatekey.json)。
列表项
InputStream privateJsonStream = dashboardActivity.getResources().openRawResource(R.raw.driveserviceprivatekey);
GoogleCredential serviceCredential = GoogleCredential.fromStream(privateJsonStream).createScoped(Arrays.asList(SCOPES));
现在您可以按如下方式使用您的驱动服务:
HttpTransport transport = AndroidHttp.newCompatibleTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
this.mService = new com.google.api.services.drive.Drive.Builder(
transport, jsonFactory, null)
.setHttpRequestInitializer(credential)
.build();
我正在尝试使用 Google Drive 来同步一些媒体文件 (video/images) 并在我的 android 应用程序中显示它们。
我已经设法使它一切正常但是根据文档(或者至少从第一次阅读来看)看起来必须总是是一个同意屏幕,用户在选择他的 google 帐户后同意该应用从他的驱动器获取数据。
关键是我想 'hardcode' 一个以编程方式同意的帐户,因为我们的应用程序总是从同一帐户获取媒体。
这可能吗??
PD:不建议任何其他存储服务,Drive 是客户的要求。
为避免用户同意,您可以使用 Service Account。
在 link 中声明,Google API 预测 API 和 Google 云存储可以代表您无需访问用户信息的应用程序。在这些情况下,您的应用程序需要向 API 证明自己的身份,但 不需要用户同意 。同样,在企业场景中,您的应用程序可以请求对某些资源的委托访问。
对于这些类型的服务器到服务器交互,您需要一个 service account,这是一个属于您的应用程序而不是单个最终用户的帐户。您的应用程序代表服务帐户调用 Google APIs,并且 不需要用户同意。 (在非服务帐户场景中,您的应用程序代表最终用户调用 Google APIs,有时需要用户同意。)
您还可以查看此相关的 SO 问题以获取更多信息。
How to use Google Drive SDK in Android project with hardcoded credentials
Why does Google OAuth2 re-ask user for permission when i send them to auth url again
最后我设法让它完全正常工作:
- 从您的 google 开发者控制台创建一个 服务帐户凭据。
- 以 json 格式下载您的凭证。
- 将文件复制到assets/res/raw.
- 将您的 json 重命名为没有奇怪字符的名称(例如:driveserviceprivatekey.json)。
列表项
InputStream privateJsonStream = dashboardActivity.getResources().openRawResource(R.raw.driveserviceprivatekey); GoogleCredential serviceCredential = GoogleCredential.fromStream(privateJsonStream).createScoped(Arrays.asList(SCOPES));
现在您可以按如下方式使用您的驱动服务:
HttpTransport transport = AndroidHttp.newCompatibleTransport(); JsonFactory jsonFactory = JacksonFactory.getDefaultInstance(); this.mService = new com.google.api.services.drive.Drive.Builder( transport, jsonFactory, null) .setHttpRequestInitializer(credential) .build();