Вопрос

Я пытаюсь использовать 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 и сохранение токена доступа и обновления в хранилище данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top