错误 403 "Access not configured"使用 JSON API 写入存储桶



我正在尝试使用以下代码使用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;
    }

bucket上的权限是所有用户的OWNER,但我仍然收到403 Forbidden"Access not configured"错误。可能出了什么问题?

一旦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的字符串,该字符串将失败。

最新更新