Я пытаюсь понять, как использовать JSON API в Android для загрузки изображений в Google Cloud Storage, но документация для этого, похоже, очень ограничена.

Я считаю, что проблема заключается в получении правильной аутентификации ключа API. Загружаемые изображения являются общедоступными, но только для пользователей моего приложения, поэтому прочтите Запросы на авторизацию указано, что мне не нужно предоставлять ключ OAuth для общедоступных данных, и я могу просто отправить ключ API.

Доступ к общедоступному API: запрос, не предоставляющий токен OAuth 2.0, должен отправлять ключ API. Ключ идентифицирует ваш проект и предоставляет доступ к API, квоту и отчеты.

Поэтому я пошел на консоль и создал ключ (API Manager/Credentials/Create Credentials/API Key) из моего SHA1 хранилища ключей отладки и производства.

Эти ключи API верны, потому что они используются с другими службами Google, такими как google sign-in, и работают нормально.

Когда я пытаюсь сделать запрос на возобновляемую загрузку, это то, что я делаю

String sUrl = "https://www.googleapis.com/upload/storage/v1/b/myBucket/o?uploadType=resumable&name="+mImgName;
URL url = new URL(sUrl);
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setRequestProperty("Authorization","AIzaSyDT....");
urlConnection.setRequestProperty("X-Upload-Content-Type","image/png");
urlConnection.setRequestProperty("X-Upload-Content-Length",String.valueOf(fileSize));
urlConnection.setRequestMethod("POST");

Однако я возвращаю Error 401 Unauthorized, поэтому я предполагаю, что это проблема с ключом, который я отправляю.

Я также видел в конце документа Authorize Requests, что в нем говорится, что я могу указать свой ключ в качестве параметра URL-адреса запроса.

После получения ключа API ваше приложение может добавлять параметр запроса key = yourAPIKey ко всем URL-адресам запроса.

Поэтому я не знаю, собираюсь ли я это делать, или в запросе установлено свойство Authorization, или и то, и другое?

Так это ключ, который я создал, не тот тип ключа, или что-то мне здесь не хватает?

5
tyczj 23 Фев 2016 в 06:32

2 ответа

Лучший ответ

При поиске подписанных URL-адресов, которые предложил @jterrace, я обнаружил, что, поскольку мне нужен возобновляемый URL-адрес, я могу просто использовать его без аутентификации клиента.

Если ваши пользователи только загружают ресурсы (записывают) в корзину с контролируемым доступом, вы можете использовать функцию возобновляемой загрузки Google Cloud Storage и не подписывать URL-адреса или не требовать учетную запись Google. В сценарии возобновляемой загрузки ваш (серверный) код аутентифицируется и инициирует загрузку в Google Cloud Storage без фактической загрузки каких-либо данных. Запрос инициации возвращает URI сеанса, который затем можно использовать в запросе клиента для загрузки данных. Клиентский запрос не нужно подписывать, потому что URI сеанса, по сути, действует как токен аутентификации.

Итак, что я делаю, я позволяю своему бэкэнду App Engine создать возобновляемый URL, а затем передать его моему клиенту, и я получаю токен аутентификации на бэкэнде с

List<String> scopes = new ArrayList<>();
scopes.add("https://www.googleapis.com/auth/devstorage.full_control");
AppIdentityService appIdentity = AppIdentityServiceFactory.getAppIdentityService();
AppIdentityService.GetAccessTokenResult accessToken = appIdentity.getAccessToken(scopes); 
urlConnection.setRequestProperty("Authorization","Bearer "+accessToken.getAccessToken());
0
tyczj 24 Фев 2016 в 12:39

Вы можете использовать ключ API для загрузки общедоступных объектов.

Но если ваша корзина не включена для публичной записи, чего вы обычно не хотите делать, вам все равно нужно использовать аутентификацию для загрузки в корзину.

В вашем случае, я думаю, вы, вероятно, захотите использовать подписанные URL-адреса.

1
jterrace 23 Фев 2016 в 21:31