0

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]); 
     } 
    } 
} 

답변

1

내 서비스 계정에 클라우드 버킷의 ACL에 대한 액세스 권한이 없을 수도 있습니다. 어쩌면 당신은 모든 버킷에 접근 할 수는 있지만 모든 버킷에 접근 할 수는 없을 것입니다. 그래서 당신은 특정 버킷에 대해 적절한 ACL을 가질 수 있다고 생각합니까?

"local"이라고 말하면, devserver를 의미합니까? Google 클라우드 저장소는 devserver에서 다르게 작동하므로 devserver가 작동하는 방식으로 설명 할 수 있습니다.

은 또한, 내 대답에, "서버"에 의해 당신이 "서버"나는 디지털 바다의 물방울을 의미하여 구글 클라우드 스토리지

+0

에 다른 버킷을 의미하는 것으로 가정. 그것은 암스테르담 3 구역에서 (디지털 바다) 암스테르담 1 구역에서 물방울들로부터 깨어 난다. 다른 고려 사항 때문에 암스테르담 3 구역으로 이전해야합니다. 애드워즈 API 및 BigQuery API에도 비슷한 문제가있었습니다. Google 지원팀은 매핑이 잘못되어 Amsterdam3 지역의 IP를 허용했습니다. 이제 우리는 Amsterdam3 영역에서 이러한 API를 사용할 수 있습니다. – Alex