0

我正在尝试使用以下代码使用 REST API 写入云存储:

  public static void insertData() {
                try {
                    StorageObject st = new StorageObject();
    //create the media object
                    Media m = new Media();
   String content = "hi! this is a test";
                    m.setData(Base64.encodeBase64String(content.getBytes()));
                    m.setContentType("text/html");
                    st.setMedia(m);
    //this gets me the credential, works for other APIs but not cloud storage
                    Storage storage = RequestBuilder.buildStorage();
                    //Create the insert and execute
                    Insert insert = storage.objects().insert("mybucket", st);
                    insert.execute();
                } catch (IOException e) {
                    log.severe(e.getMessage());
                }
            }

这是我根据 REST API 的 ACL 条目:

 "kind": "storage#bucketAccessControls",
 "items": [
  {
   "kind": "storage#bucketAccessControl",
   "id": "gammeprediction/allUsers",
   "selfLink": "https://www.googleapis.com/storage/v1beta1/b/gammeprediction/acl/allUsers",
   "bucket": "mybucket",
   "entity": "allUsers",
   "role": "OWNER"
  }]

这就是我获得证书的方式:

private static Credential authorize() {
        GoogleCredential credential = null;
        //load properties
        Properties appProperties = new Properties();
            appProperties.load(RequestBuilder.class
                    .getResourceAsStream("/app.properties"));

        // creates an authorization with the key and service account given
        InputStream is = RequestBuilder.class.getResourceAsStream("/"
                + appProperties.getProperty("app.keyFileName"));
        PrivateKey pk;
        try {
            pk = PrivateKeys.loadFromKeyStore(KeyStore.getInstance("PKCS12"),
                    is, "notasecret", "privatekey", "notasecret");
            credential = new GoogleCredential.Builder()
                    .setTransport(HTTP_TRANSPORT)
                    .setJsonFactory(JSON_FACTORY)
                    .setServiceAccountId(
                            appProperties
                                    .getProperty("app.serviceAccount"))
                    .setServiceAccountPrivateKey(pk)
                    .setServiceAccountScopes(PredictionScopes.PREDICTION,
                            DriveScopes.DRIVE, StorageScopes.DEVSTORAGE_FULL_CONTROL).build();


        return credential;
    }

存储桶上的权限是所有用户的 OWNER,但我仍然收到 403 Forbidden "Access not configured" 错误。什么可能是错的?

4

1 回答 1

1

一旦 JSON API 普遍可用,这个逻辑就会起作用。

但是,目前 JSON API 处于有限预览阶段。由于未知用户不被视为受限预览版的成员,因此目前无法通过 REST API 进行完全匿名的查询。相反,您必须在连接时至少提供一个列入白名单的 API 密钥。如果您没有提供更多身份信息,您将被视为匿名用户。或者,更进一步,您可以使用 OAuth2 凭据而不是被视为注册用户。有关更多信息,请参阅:https ://developers.google.com/storage/docs/json_api/

那是一个 GWT RequestBuilder 吗?不幸的是,我并不完全熟悉它的用途。如果有帮助,以下是使用 Google API Java 客户端设置与 API 密钥的连接的示例:https ://code.google.com/p/google-api-java-client/wiki/OAuth2#Unauthenticated_access

此外,您对 setData() 的调用似乎传递了一个非 base64 字符串,这将失败。

于 2013-02-07T18:56:57.237 回答