API REST Firebase Storage - PullRequest
       26

API REST Firebase Storage

1 голос
/ 25 сентября 2019

Мне нужен очень простой статический сервер изображений для моего приложения.Я думаю об облачном хранилище, потому что не хочу беспокоиться об администрировании собственного сервера.Я использую экспериментальный Flutter for Desktop в качестве инструмента для подготовки данных для мобильного приложения, поэтому я могу использовать только REST API.Я обнаружил, что Firebase Storage не имеет собственного REST API и использует Google Cloud.Чтобы загрузить изображение в облачное хранилище, я должен сделать что-то вроде этого:

curl -X POST --data-binary @[IMAGE_LOCATION] \
-H "Authorization: Bearer [OAUTH2_TOKEN]" \
-H "Content-Type: image/jpeg" \
"https://www.googleapis.com/upload/storage/v1/b/[BUCKET_NAME]/o?uploadType=media&name=[IMAGE_NAME]"

Проблема в том, что я не могу понять, как получить [OAUTH2_TOKEN] (токен доступа) из моего кода Dart и как администрировать мойimages (следует ли мне что-то делать с Firebase Admin SDK?)

Может ли кто-нибудь мне помочь, пожалуйста?

1 Ответ

1 голос
/ 26 сентября 2019

Я нашел ответ на этот вопрос.Сначала вам нужно создать закрытый ключ для служебной учетной записи в настройках Firebase.Затем используйте его, чтобы получить токен доступа с помощью пакетов dart googleapis_auth и http.

var accountCredentials = ServiceAccountCredentials.fromJson({
  "private_key_id": "<please fill in>",
  "private_key": "<please fill in>",
  "client_email": "<please fill in>@developer.gserviceaccount.com",
  "client_id": "<please fill in>.apps.googleusercontent.com",
  "type": "service_account"
});

var scopes = [
  'https://www.googleapis.com/auth/cloud-platform',
];

var client = Client();
AccessCredentials credentials = await obtainAccessCredentialsViaServiceAccount(accountCredentials, scopes, client);
String accessToken = credentials.accessToken.data;

File image = File('path/to/image');

var request = Request(
  'POST',
  Uri.parse('https://www.googleapis.com/upload/storage/v1/b/[BUCKET_NAME]/o?uploadType=media&name=images/$imageName'),
);
request.headers['Authorization'] = "Bearer $accessToken";
request.headers['Content-Type'] = "image/jpeg";
request.bodyBytes = await image.readAsBytes();

Response response = await Response.fromStream(await request.send());
print(response.statusCode);
client.close();

Получить запрос вы можете аналогичным образом, но вы должны закодировать firebase path to image:

var imagePath = 'images/img.jpg';
var encodedImagePath = Uri.encodeQueryComponent(imagePath);
var request = Request(
  'GET', 
  Uri.parse('https://www.googleapis.com/storage/v1/b/[BUCKET_NAME]/o/$encodedImagePath?alt=media'),
);
request.headers['Authorization'] = "Bearer $accessToken";

API Google REST Cloud: https://cloud.google.com/storage/docs/downloading-objects

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...