Google 클라우드 스토리지 API에 액세스하려면 google-api-java-client를 사용하고 있습니다. 그것은 내 로컬 컴퓨터 및 일부 서버에서 잘 작동합니다. 그러나 프로덕션 서버에서 400 개의 잘못된 요청 (오류 : invalid_grant)으로 실패합니다. Google API Adwords Support에서 해결 한 Google Adwords API와 비슷한 문제가있었습니다. 나는 그들이 내가 사용하는 서버의 IP를 그냥 허용한다고 생각한다. Google Cloud Storage API에 권한을 추가해야 할 수 있습니까? 내 로컬 PC에서 작동하기 때문에 이상 할 것입니다.Google Cloud Storage의 서비스 계정 인증은 일부 서버에서는 작동하지만 다른 서버에서는 작동하지 않습니다.
public class StorageObj {
private static final String KEY_FILE_NAME = "key.p12";
private static final String APPLICATION_NAME = "application_name";
private static final String BUCKET_NAME = "bucket_name";
private static final String STORAGE_OAUTH_SCOPE = "https://www.googleapis.com/auth/devstorage.read_write";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private final Storage storageObject;
public StorageObj() throws GeneralSecurityException, IOException {
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_ACCOUNT_EMAIL)
.setServiceAccountScopes(Collections.singleton(STORAGE_OAUTH_SCOPE))
.setServiceAccountPrivateKeyFromP12File(new File(KEY_FILE_NAME))
.build();
this.storageObject = new Storage.Builder(httpTransport, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME)
.build();
;
}
public void insert(String folder, String file) throws IOException {
try (FileInputStream inputStream = new FileInputStream(new File(folder + file))) {
InputStreamContent mediaContent = new InputStreamContent("application/octet-stream", inputStream);
mediaContent.setLength(inputStream.available());
Storage.Objects.Insert insertObject = storageObject.objects()
.insert(BUCKET_NAME, null /* obj-meta-data */, mediaContent)
.setName(file);
int _2MB = 2 * 1000 * 1000;
if (mediaContent.getLength() > 0 && mediaContent.getLength() <= _2MB) {
insertObject.getMediaHttpUploader().setDirectUploadEnabled(true);
}
insertObject.execute();
}
public static void main(String[] args) throws IOException, GeneralSecurityException {
new StorageObj().insert(args[0], args[1]);
}
}
}
에 다른 버킷을 의미하는 것으로 가정. 그것은 암스테르담 3 구역에서 (디지털 바다) 암스테르담 1 구역에서 물방울들로부터 깨어 난다. 다른 고려 사항 때문에 암스테르담 3 구역으로 이전해야합니다. 애드워즈 API 및 BigQuery API에도 비슷한 문제가있었습니다. Google 지원팀은 매핑이 잘못되어 Amsterdam3 지역의 IP를 허용했습니다. 이제 우리는 Amsterdam3 영역에서 이러한 API를 사용할 수 있습니다. – Alex