API Google Диска через Google App Engine
-
12-12-2019 - |
Вопрос
Я пытаюсь использовать API Google Диска через Идентичность приложения интерфейс, предоставляемый Google App Engine.По сути, это позволяет моему веб-приложению взаимодействовать с API Google. с сервера на сервер.
Мне не нужно, чтобы пользователи входили в систему, мне просто нужно отображать мои собственные документы на Google Диске.
Однако после того, как я установил все соответствующие значения и области действия и включил все нужные ручки Google Диска на странице консоли, я все равно получаю это для простого запроса GET к https://www.googleapis.com/drive/v2/files
:
{ "error": { "errors": [ { "domain": "usageLimits", "reason": "dailyLimitExceededUnreg", "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.", "extendedHelp": "https://code.google.com/apis/console" } ], "code": 403, "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup." }}
В чем дело?Что мне не хватает?Вот код, который на самом деле выполняет запрос - забавно то, что он отлично работает, если я использую другие API, такие как API сокращения URL-адресов:
var scopes = new java.util.ArrayList();
scopes.add("https://www.googleapis.com/auth/drive");
var appIdentity = AppIdentityServiceFactory.getAppIdentityService();
var accessToken = appIdentity.getAccessToken(scopes);
var url = new URL("https://www.googleapis.com/drive/v2/files");
var connection = url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("GET");
connection.addRequestProperty("Content-Type", "application/json");
connection.addRequestProperty("Authorization", "OAuth " + accessToken.getAccessToken());
РЕДАКТИРОВАТЬ
Если я просто изменю API, чтобы использовать urlshortner
API, например, работает:
var url = new URL("https://www.googleapis.com/urlshortener/v1/url/history");
И вывод:
{ "kind": "urlshortener#urlHistory", "totalItems": 0, "itemsPerPage": 30}
Значит, что-то не работает с Google Диском и App Identity?
РЕДАКТИРОВАТЬ 2
Я нашел некоторую помощь от правильного ответа здесь: https://stackoverflow.com/a/12526286/50394
Но речь идет о настройке областей клиентского API в Google Apps, а я не использую Google Apps, я просто использую домен Google App Engine. foo.appspot.com
Решение
Ошибка 403, которую вы получаете, означает, что в вашем GET не было заголовка авторизации.Логика в том, что без заголовка авторизации вы анонимны (вас легион бла-бла :-)).Квота Диска для анонимного использования равна нулю, отсюда и сообщение.Сокращатель URL-адресов имеет более высокую квоту для анонимности, поэтому он работает.
Я предлагаю вам изменить URL-адрес, чтобы он указывал на ваш собственный http-сервер, и проверить, какие заголовки вы на самом деле отправляете.
Другие советы
AFAICT вы должны использовать Bearer
в заголовке Авторизация.
Вероятно, происходит следующее: Drive API не распознает учетную запись службы (из-за неправильного заголовка?) и, таким образом, воспринимает ее как анонимный запрос, поскольку нет key
параметр также не был предоставлен (см. общие параметры запроса).
Попробуй это:
connection.addRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());
Или вы можете попробовать добавить токен как access_token
параметр запроса.
Я думаю, вам следует хотя бы настроить запись консоли API с включенным Drive API по адресу https://code.google.com/apis/consoleСоздав это, вы получите идентификатор, который сможете использовать в своем объекте GoogleCredential.Из объекта GoogleCredential вы можете получить токен доступа, который затем можете добавить в свой запрос.
Что я здесь прочитал(Google диск через сервисные аккаунты) заключалось в том, что вы используете немного другой стиль, в котором используется КЛЮЧ API, который вы получаете из консоли разработчика.
Соответствующие части для меня заключались в том, чтобы создать «Ключ для серверных приложений», а затем использовать эту технику, которую я не читал. где-нибудь еще!
HttpTransport httpTransport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();
AppIdentityCredential credential =
new AppIdentityCredential.Builder(DriveScopes.DRIVE).build();
// API_KEY is from the Google Console as a server API key
GoogleClientRequestInitializer keyInitializer =
new CommonGoogleClientRequestInitializer(API_KEY);
Drive service = new Drive.Builder(httpTransport, jsonFactory, null)
.setHttpRequestInitializer(credential)
.setGoogleClientRequestInitializer(keyInitializer)
.build();
Этот отвечать заявляет, что:
Учетные записи услуг не поддерживаются Drive SDK из -за его модели безопасности.
Если это все еще так, одним из обходных путей является выполнение обычного танца OAuth один раз с обычной учетной записью Google и сохранение токена доступа и обновления в хранилище данных.