如何在没有客户机密的情况下构建GoogleCredential?

时间:2013-02-22 17:10:50

标签: android google-drive-api

我正在创建一个Android应用,该应用使用常规Google云端硬盘帐户作为应用程序拥有的帐户,具有令人难以置信的简洁,在这里:

Use regular Google accounts as application-owned accounts

不幸的是,关于如何在Drive上执行任何操作的所有描述都引用了客户端密钥,如下所述:

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(...)调用,因为我没有安装应用程序的客户端密码。

基本上,我不能制作这个凭证,而且我所看到的关于制作凭证的每一个建议都属于这三个类别中的一个:

  1. 专为用户登录自己的帐户而设计。不能接受的;我想为所有用户设置一个云端硬盘帐户,但需要一个普通帐户,而不是服务帐户(指定的客户端)。
  2. 基于AccountManager或其他一些身份验证系统。因同样的原因不能接受。
  3. 对Google API的恶劣态度感到震惊。建议以老式的方式提出请求。
  4. 顺便说一下,如果没有设置客户端密码,我会在NullPointerException中获得Preconditions.class。它没有告诉我很多相关信息。我还尝试通过子类化直接创建GoogleCredential,并指示我使用GoogleCredential.Builder,这就是我发现自己的原因。

    如何解决此客户端密码问题?

2 个答案:

答案 0 :(得分:0)

答案似乎是取消注释。只要某事在客户端密码字段中,GoogleCredential.Builder就可以成功构建凭证对象。但它真的得到了驱动器吗?坚持下去。

编辑:不,我收到“invalid_client”错误。这非常令人沮丧。

答案 1 :(得分:0)

以下是使用已接受答案的帮助,在编辑中提供自己答案的问题的链接:

How setup Google Drive Credentials within Android App?

简而言之,最重要的是您需要从开发人员api控制台获取一个简单的api访问密钥。如果找不到,则可能需要设置驱动器api访问权限。