使用非服务帐户从Android进行Google存储访问 - 403 Forbidden / Access Not Configured

时间:2015-05-07 00:13:49

标签: android oauth-2.0 google-api google-cloud-storage

这是一次令人沮丧的经历。我正在尝试访问Google云端存储(向所有人列出存储桶访问权限),并通过非服务帐户从Android进行操作。

这是我的代码:

    import com.google.api.client.auth.oauth2.Credential;
    import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    import com.google.api.client.http.HttpTransport;
    import com.google.api.client.http.InputStreamContent;
    import com.google.api.client.http.javanet.NetHttpTransport;
    import com.google.api.client.json.JsonFactory;
    import com.google.api.client.json.jackson2.JacksonFactory;
    import com.google.api.services.storage.Storage;
    import com.google.api.services.storage.model.Bucket;
    import com.google.api.services.storage.model.StorageObject;

    HttpTransport httpTransport = new NetHttpTransport();
    JsonFactory jsonFactory = new JacksonFactory();

    Credential credential = new GoogleCredential.Builder()
            .setClientSecrets("ANDROID_CLIENT_ID_FROM_DEV_CONSOLE", "some random string, since no clienet secret for android")
            .setJsonFactory(jsonFactory)
            .setTransport(httpTransport)
            .build();
    credential.setAccessToken(token);

    Storage storage = new Storage.Builder(httpTransport, jsonFactory,
            credential)
            .setApplicationName("My app name")
            .build();
    List<StorageObject> objects = storage.objects().list("my-bucket").execute().getItems()   

考虑:

  • 我得到一个有效的oauth令牌,它具有以下范围: “oauth2:https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/devstorage.read_write

  • 我在Cloud Dev Console的API部分启用了Google Cloud Storage JSON API和Google Cloud Storage。

  • 作为替代方案,我尝试使用serivce帐户进行设置(即在创建GoogleCredential时使用setServiceAccountId(...)等方法)并且它完美运行。但我希望这可以代表授权用户工作,如上面的代码片段所示!

  • 我的所有代码都在com.mytestapp包中。这是我在创建Android客户端ID时指定的包。

  • 我正在通过Android Studio中的调试器启动应用,同时应用程序在我的物理Android设备上启动。

问题陈述:

在执行上面的列表存储区操作期间,我得到了这个Json异常:

com.google.api.client.googleapis.json.GoogleJsonResponseException:403 Forbidden {   “代码”:403,   “错误”:[{     “domain”:“usageLimits”,     “message”:“未配置访问权限。您的项目未启用API(云存储API)。............}

我做错了什么?是因为我没有设置客户端密码吗? (我认为Android不再是客户机密)。或者应用程序名称必须非常具体?我将它设置为一些自由格式的文本字符串。

我认为这应该是简单明了的!

至少 - 是否有针对Android上非服务帐户如何执行此操作的连贯完整示例?我搜遍了整个地方,没有任何运气。

1 个答案:

答案 0 :(得分:0)

好的,我解决了。应用程序的SHA1签名是错误的。因此,它与Google之间的凭据不匹配。