Как загрузить объект из Google Cloud Storage через Java Admin SDK?

В настоящее время я разрабатываю Java-приложение, которое использует Admin SDK для хранения и получения данных из Google Firestore, но я также хотел распространить это использование и на Google Cloud Storage. Когда дело доходит до Firestore, очень четко указано, что доступ через Admin SDK игнорирует все правила безопасности Firebase, и в результате создания приложения Firebase с учетными данными моей учетной записи службы достаточно, чтобы предоставить доступ ко всем операциям (если я правильно понял это). до сих пор).

Однако когда я пытаюсь загрузить файлы .png, которые я загрузил в облачное хранилище, через Admin SDK, я получаю следующую ошибку.

{
  "code" : 401,
  "errors" : [ {
    "domain" : "global",
    "location" : "Authorization",
    "locationType" : "header",
    "message" : "Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object. Permission 'storage.objects.get' denied on resource (or it may not exist).",
    "reason" : "required"
  } ],
  "message" : "Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object. Permission 'storage.objects.get' denied on resource (or it may not exist)."
}

Вот код, который выдает эту ошибку.

public void downloadImage() {
        
        firebase.initializeFirebase();

        Storage storage = StorageOptions.newBuilder()
                                  .setProjectId(MY_FIREBASE_ID).build()
                                  .getService();
        
        Blob blob = storage.get(BlobId.of(STORAGE_ID, OBJECT_NAME));
        blob.downloadTo(Paths.get(PATH));
    }

Роли учетной записи службы включают в себя администратора, администратора хранилища, средства просмотра объектов хранилища, администратора объекта хранилища и некоторые другие. Приложение Firebase инициализируется методом firebase.initializeFirebase() с учетными данными, которые я упомянул выше.

Я думал, что Admin SDK предоставляет полный доступ к приложению Firebase только с соответствующими ролями IAM. В поисках этой ошибки я обнаружил несколько способов корректной аутентификации и разрешения доступа, но все они использовали Firebase CLI. Но как я могу сделать то же самое, используя только Admin SDK и код Java?

Как указано выше, я попытался назначить все роли, связанные с хранилищем, моей учетной записи службы и создал новый файл JSON с моими учетными данными. Затем я использовал приведенный выше код, чтобы попытаться загрузить изображение из Cloud Storage, но безуспешно. Я даже дошел до того, что разрешил кому угодно публичный доступ к облачному хранилищу. Я зашел в правила Cloud Storage и включил доступ на чтение и запись без каких-либо условий. Но прогресса по-прежнему нет. Я искал этот конкретный вопрос, который задаю прямо сейчас, но результаты мне не помогли. Возможно я что-то пропустил, в таком случае прошу прощения.

🤔 А знаете ли вы, что...
Java используется в большом количестве крупных корпоративных приложений и систем.


2
111
1

Ответ:

Решено

Ошибка говорит о том, что вы не используете какие-либо учетные данные в запросе. Если вы хотите авторизовать запрос с помощью переменных env, ознакомьтесь с документацией чтобы служба хранения могла обнаружить учетные данные (за пределами экземпляра облака Google)

ОБЯЗАТЕЛЬНО добавьте необходимые разрешения для своей учетной записи службы и сегмента.

  1. Для учетной записи службы: перейдите в консоль Google Cloud > IAM и администратор > найдите свою учетную запись службы, которую вы хотите использовать > Изменить принципала > Добавить роль > выберите желаемую роль (я выбрал администратора хранилища, чтобы эта учетная запись службы имела полный доступ к корзинам и предметы внутри них)
  2. Для сегмента: перейдите в Google Cloud Console > Облачное хранилище > Бакеты > Выберите сегмент > Дополнительные действия (3 точки справа) > Редактировать доступ > Добавить принципала > В поле Принципал добавьте имя/адрес электронной почты своей учетной записи службы и роли. , установите то же, что и для своей учетной записи службы (например, администратора хранилища).

Если вы ранее настроили приложение Firebase и загрузили файл JSON со своими учетными данными, вы можете использовать этот файл JSON для авторизации вашего запроса в Cloud Storage, не настраивая переменные env следующим образом:

InputStream serviceAccount = new FileInputStream("your-path-to-json-credentials");

Storage storage = StorageOptions.newBuilder().setProjectId(PROJECT_ID).setCredentials(GoogleCredentials.fromStream(serviceAccount)).build().getService();

С другой стороны, если у вас нет учетных данных в формате JSON и вам просто нужен доступ к облачному хранилищу, перейдите в Google Cloud Console > IAM и администратор > Учетные записи служб > Выберите свою учетную запись службы > Дополнительные параметры (3 точки на справа) > Управление ключами > Добавить ключ > Создать новый ключ > Формат JSON. Теперь загрузите файл JSON и используйте этот путь, как показано выше в коде.

Теперь, когда вы пытаетесь загрузить, создать или удалить объекты из нужного сегмента, Google знает, что запрос поступает от вашего сервисного аккаунта.