11

Я пытаюсь получить доступ к API Gmail с помощью приложения для Android. Я успешно запросил и получил токен доступа, используя все доступные комбинации областей видимости. Но мне кажется, что каждый раз, когда я на самом деле пытаются использовать команду Gmail API я получаю 403 exception reading: Access not configured please use Google developers console to activate the api...Доступ к API Gmail с помощью Android

Излишне говорить API активируется и ключ клиента был создан, используя правильное имя пакета & sha1 код. Такой же идентификатор клиента хорошо работает с функциями Google Plus.

Любой, у кого есть эта проблема или удалось подключиться к Gmail api из Android?

Благодаря

Вот лог:

09-04 21:40:54.014: W/System.err(26717): com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden 
09-04 21:40:54.014: W/System.err(26717): { 
09-04 21:40:54.014: W/System.err(26717): "code" : 403, 
09-04 21:40:54.014: W/System.err(26717): "errors" : [ { 
09-04 21:40:54.014: W/System.err(26717):  "domain" : "usageLimits", 
09-04 21:40:54.014: W/System.err(26717):  "message" : "Access Not Configured. Please use Google Developers Console to activate the API for your project.", 
09-04 21:40:54.014: W/System.err(26717):  "reason" : "accessNotConfigured" 
09-04 21:40:54.014: W/System.err(26717): } ], 
09-04 21:40:54.014: W/System.err(26717): "message" : "Access Not Configured. Please use Google Developers Console to activate the API for your project." 
09-04 21:40:54.014: W/System.err(26717): } 

Существуют ли какие-либо другие API, которые должны быть включены в API консоли, кроме Google+ API и API Gmail?

EDIT:

Я обнаружил, что с помощью проверки подлинности на основе WebView приведет маркер доступа, который будет предоставлять доступ к Gmail API, но это не является правильным решением, так как маркер недолгим. На данный момент GoogleAuthUtil предоставит токен, но его привилегий недостаточно для использования API Gmail. Кто-нибудь имел успех в подключении Android с API Gmail и хотел бы поделиться?

EDIT2:

Вот фрагменты того, что я делаю:

Получение токена:

token = GoogleAuthUtil.getToken(MainActivity.this, Plus.AccountApi.getAccountName(mGoogleApiClient), scope); 

Попытка извлечь сообщения из API Gmail:

GoogleCredential credential = new GoogleCredential().setAccessToken(token); 
JsonFactory jsonFactory = new JacksonFactory(); 
HttpTransport httpTransport = new NetHttpTransport(); 

service = new Gmail.Builder(httpTransport, jsonFactory, credential).setApplicationName("GmailApiTP").build(); 
ListMessagesResponse messagesRespose; 
List<Message> m = null; 

ArrayList<String> ids = new ArrayList<String>(); 
ids.add("INBOX"); 
try { 
    messagesRespose = service.users().messages().list("me").setLabelIds(ids).setQ("From: something") 
      .execute(); 
    m = messagesRespose.getMessages(); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

Исключение вызывается при использовании службы API Gmail. Кроме того, я попробовал очистить токен и попросить новый с тем же результатом.

+0

Вы пытаетесь реализовать этот пример (https://developers.google.com/gmail/api/quickstart/quickstart-java#step_1_enable_the_gmail_api)? –

+0

Да. это достаточно просто. Но все же не объясняет, почему GooglaApiCient возвращает непригодный токен. – TalMihr

+0

Как и в случае с данными, 'GoogleAuthUtil' отлично работает для меня с использованием API Gmail для отправки электронной почты из службы на Jelly Bean и KitKat. Я использую API REST напрямую (т. Е. Через «HttpURLConnection») вместо клиентской библиотеки Java, но это должно быть независимо от получения маркера. Я получал ваше 403 некоторое время, пока я правильно установил идентификатор клиента для Android-приложения, но после этого все было хорошо, при этом обновление обрабатывалось автоматически. Одно из возможных мест, которые вы не видите, - это обращение 'UserRecoverableAuthExtension' к вызову' getToken() '. – rhashimoto

ответ

3

Это сообщение об ошибке обманчиво, я считаю, что это также происходит, когда клиент учетных данных проекта разработчика неверен. Например, вы выбрали «веб-приложение», когда действительно хотите «установленное приложение».

Confirm вы правильно следуя инструкциям из: https://developers.google.com/accounts/docs/OAuth2

(должен быть «установленного приложения» и т.д.)

Вы можете разместить информацию OAuth клиента у вас есть из консоли разработчиков? (Тип и любая другая конфиденциальная информация там и т. Д.)

+0

Создал установленное приложение (android) с глубокой привязкой. Sha1 и пакет проверены. Тот же самый идентификатор clienr хорошо работает с Google plus API.Получив представление о том, что этот API не предназначен для общения с Android – TalMihr

+0

API является агентом, не зависящим от клиента/платформы, он должен работать как на Android, так и на любом другом API Google. Не уверен, что проблема здесь, надеюсь, кто-то, смотрящий теги google-oauth или google-oauth-java-client, может тогда дать некоторое представление. –

+0

Спасибо. Я продолжаю пытаться выяснить, что случилось. Проблема в том, что я не вижу большого количества пользователей Android-приложений Gmail API, чтобы получить хорошие отзывы о том, кто на самом деле получил работу. – TalMihr

-2

Ну вот сделка. Пока что токены, данные GoogleAuthUtil & & AccountManager не работает с API Gmail. Не знаю, является ли это Google или нет, но мое решение таково:

Создайте идентификатор клиента (Applicaion-> Other) в консоли API. Используйте идентификатор клиента & Секрет клиента, чтобы получить токен доступа через WebView. Сохранить результат Обновить токен. Теперь, когда вы хотите, чтобы обновить Токен доступа использовать этот запрос:

httpClient = new DefaultHttpClient(); 
    httpPost = new HttpPost(address); 
    params.add(new BasicNameValuePair("refresh_token", token)); 
    params.add(new BasicNameValuePair("client_id", client_id)); 
    params.add(new BasicNameValuePair("client_secret", client_secret)); 
    params.add(new BasicNameValuePair("grant_type", "refresh_token")); 
    httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); 
    httpPost.setEntity(new UrlEncodedFormEntity(params)); 
    HttpResponse httpResponse = httpClient.execute(httpPost); 
    HttpEntity httpEntity = httpResponse.getEntity(); 
    is = httpEntity.getContent(); 

работает для меня. Надеюсь, что в будущем действительный токен будет предоставлен с помощью параметра GoogleAuthUtil.getToken().

+0

Нет ли другого способа, кроме использования веб-представления? –

5

Хотя это не описано четко, проблема в том, что токен, полученный через GoogleAuthUtil.getToken(), кэшируется локально и может истекать. Ошибка 403, которую вы получаете, связана с истекшим токеном. Правильный способ справиться с этой ситуацией - позвонить GoogleAuthUtil.clearToken(), чтобы удалить локально кэшированный токен, а затем позвонить GoogleAuthUtil.getToken(), чтобы получить новый.

В качестве альтернативы вы можете отслеживать последний раз, когда вы запрашивали токен, и если это было больше часа (время истечения по умолчанию для этих токенов), то вызовы clearToken + getToken предварительно превентивно.

+0

Так что я должен делать что-то ужасно неправильно, потому что даже если я прошу новый токен с GoogleAuthUtil.getToken(), а затем очистю его с помощью GoogleAuthUtil.clearToken(), а затем запросит новый, новый все еще не работает (403) , – TalMihr

+0

Удалось ли вам подключиться к API Gmail с помощью GoogleAuthUtil? Было бы прекрасно, если бы вы могли поделиться своим кодом. Может быть, я совсем не против? – TalMihr

+0

Вот подробности лексем: { "issued_to": "608941808256-43vtfndets79kf5hac8ieujto8837660.apps.googleusercontent.com", "аудитория": "608941808256-43vtfndets79kf5hac8ieujto8837660.apps.googleusercontent.com", "Сфера": «https: //www.googleapis.com/auth/gmail.readonly https://www.googleapis.com/auth/gmail.modify ", " expires_in ": 3589, " access_type ":" offline " } – TalMihr

0

Вам необходимо настроить свой Android-приложение в Google Dev Console.

  1. Выберите проект, выберите API & Auth, затем выберите Учетные данные
  2. Создать новый идентификатор клиента (хотя есть и другие клиентские идентификаторы)
  3. Выберите установленное приложение -> Android
  4. Заполните ваше имя пакета и SHA1 правильно
  5. Создать новый ключ (хотя есть и другие клиентские ключи)
  6. Выбор Android ключа
  7. заливку в SHA1; р ackageName вот так: 45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0;com.example

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

Смежные вопросы