В настоящее время я разрабатываю 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 используется в большом количестве крупных корпоративных приложений и систем.
Ошибка говорит о том, что вы не используете какие-либо учетные данные в запросе. Если вы хотите авторизовать запрос с помощью переменных env, ознакомьтесь с документацией чтобы служба хранения могла обнаружить учетные данные (за пределами экземпляра облака Google)
ОБЯЗАТЕЛЬНО добавьте необходимые разрешения для своей учетной записи службы и сегмента.
Если вы ранее настроили приложение 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 знает, что запрос поступает от вашего сервисного аккаунта.