【发布时间】:2013-02-06 21:08:08
【问题描述】:
我正在尝试使用以下代码通过 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”错误。可能有什么问题?
【问题讨论】:
-
当您说 OWNER 时,您是指 FULL_CONTROL 吗?我相信
owner会自动设置为项目所有者的组 ID。 (见developers.google.com/storage/docs/accesscontrol)你能分享桶上的实际ACL吗?您可以通过gsutil getacl gs://mybucket获得此信息。 -
要尝试的另一件事是使用 gsutil 进行上传测试以确保您的权限正确。如果有效,我们可以关注java代码,如果无效,我们应该关注权限。
-
我不使用 gsutil 而是使用 api explorer 来设置 ACL。我会尝试使用 gsutil,但我认为它设置正确。
-
我也可以使用 Java API 写入存储桶,但我想迁移到 REST API 以实现互操作性