【发布时间】:2013-02-08 09:22:38
【问题描述】:
我正在创建一个 Android 应用程序,它使用常规的 Google Drive 帐户作为应用程序拥有的帐户,如上所述,非常简洁,在这里:
Use regular Google accounts as application-owned accounts
不幸的是,关于如何在云端硬盘上执行任何操作的所有描述都引用了客户端机密,如下所述:
Google APIs Console - missing client secret
对于已安装的应用程序,它不再存在。通过构建一个实际的网页,我设法获得了一个 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(...) 调用注释掉,因为我没有已安装应用程序的客户端密码。
基本上,我无法制作这个证书,而且我看到的关于制作证书的每条建议都属于以下三类之一:
- 专为用户登录自己的帐户而设计。不能接受的;我希望所有用户都拥有一个云端硬盘帐户,但需要一个普通帐户,而不是服务帐户(客户指定)。
- 基于 AccountManager 或其他一些身份验证系统。出于同样的原因不可接受。
- 惊恐地举起双手,对 Google API 的过分行为感到震惊。建议以老式方式提出请求。
顺便说一句,在没有设置客户端密码的情况下,我在Preconditions.class 中得到了一个NullPointerException。它并没有告诉我很多关于这个的事情。我还尝试通过子类化直接创建 GoogleCredential,它指示我使用 GoogleCredential.Builder,这就是我发现自己在这里的原因。
我该怎么做才能解决这个客户机密问题?
【问题讨论】: