我正在创建一个 Android 应用程序,它使用常规的 Google Drive 帐户作为应用程序拥有的帐户,如上所述,简洁得令人难以置信,在这里:
不幸的是,关于如何在 Drive 上执行任何操作的所有描述都引用了客户端机密,如下所述:
对于已安装的应用程序,它实际上不再存在。通过构建一个实际的网页,我设法获得了一个 OAuth2 令牌。从这里我获得了一个访问令牌和一个刷新令牌,如第一个链接中所述。我想GoogleCredential
用这些做一个对象,据我所知,这应该像这样工作:
HttpTransport httpTransport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setClientSecrets(
new GoogleClientSecrets().setInstalled(
new Details()
.setAuthUri(AUTH_URI)
.setClientId(CLIENT_ID)
//.setClientSecret("but I haven't got one!")
.setRedirectUris(REDIRECT_URIS)
)
)
.build()
.setAccessToken(ACCESS_TOKEN) //defined above
.setRefreshToken(REFRESH_TOKEN); //defined above
Drive.Builder driveBuilder = new Drive.Builder(httpTransport, jsonFactory, null);
driveBuilder.setHttpRequestInitializer(credential);
我已经setClientSecret(...)
按照注释进行了调用,因为我没有已安装应用程序的客户端密码。
基本上,我不能制作这个证书,而且我看到的关于制作证书的每一个建议都属于以下三类之一:
- 专为用户登录自己的帐户而设计。不能接受的; 我希望所有用户都有一个 Drive 帐户,但需要一个普通帐户,而不是服务帐户(指定的客户)。
- 基于 AccountManager 或其他一些身份验证系统。出于同样的原因不能接受。
- 对 Google API 的过分行为感到震惊。建议用老式的方式提出请求。
顺便说一句,如果没有设置客户端密码,我会得到一个NullPointerException
in Preconditions.class
. 它并没有告诉我很多关于这个的事情。我还尝试通过子类化直接创建 GoogleCredential,它指示我使用 a GoogleCredential.Builder
,这就是我发现自己在这里的原因。
我该怎么做才能解决这个客户秘密问题?