Ответ API календаря: «403: превышен дневной лимит» - расширение Google Chrome - PullRequest
2 голосов
/ 22 февраля 2012

Я начал с небольшого приложения для показа некоторой соответствующей информации нашей команде разработчиков, которая собрана из разных источников. Как и календарь Google, бэк-офис нашего проекта, серверные логи openarena и т. Д.

Я начал с веб-приложения, но затем решил переключить проект на расширение Chrome. Теперь у меня уже есть интеграция с календарем Google, и я использую V3 Javascript (альфа) Client-Lib. Это больше не работало, потому что мне пришлось сменить танец OAUTH с танца для веб-приложений на танец с упакованными / установленными приложениями.

Для этого я последовал уроку (это мое первое расширение.) http://code.google.com/chrome/extensions/tut_oauth.html и снова заработал танец OAUTH. Сейчас я пытаюсь запросить мои данные календаря из API Google, используя метод подписанного запроса из учебного пособия, но всегда получаю ответ «Превышен дневной лимит. Пожалуйста, зарегистрируйтесь» (Консоль Api показывает, что я не выполнял никакого запроса) .

Может быть, у кого-то есть представление о том, что я делаю здесь неправильно, потому что я попробовал все, о чем мог подумать. Заранее спасибо, Флориан

Код - manifest.json:

{
    "name": "MIS",
    "version": "0.1",
    "description": "Monitor Information System",
    "background_page": "background.html",

    "browser_action": {
        "default_icon": "img/mis/icon.png",
        "default_title": "Mis"
    },

    "permissions": [
    "tabs",
    "https://www.googleapis.com/",
    "https://www.google.com/"]
}

background.html:

...         
oauth = ChromeExOAuth.initBackgroundPage
({
'request_url':'https://www.google.com/accounts/OAuthGetRequestToken',
'authorize_url':'https://www.google.com/accounts/OAuthAuthorizeToken',
'access_url':'https://www.google.com/accounts/OAuthGetAccessToken',
'consumer_key': 'anonymous',
'consumer_secret': 'anonymous',
'scope': 'https://www.googleapis.com/auth/calendar',
'app_name': 'Mis'
}); 
...

main.html Вызов метода:

function performCalendarEventsRequest(calendarId)
{
var requestUrl = 'https://www.googleapis.com/calendar/v3/calendars/'+calendarId+'/events';
var request = {
    'method': 'GET',
    'headers': {
      'GData-Version': '3.0',
      'Content-Type': 'application/atom+xml'
    },
    'parameters': {
      'alt': 'json'
    },
    'body': 'Data to send'
  };

 oauth.sendSignedRequest(requestUrl, calendarEventsRequestCallback, request);
}

Ответы [ 2 ]

0 голосов
/ 06 января 2016

Я знаю, что это старый вопрос, но я застрял в той же ошибке, используя реализацию PHP (бета-версию) API (2016-01-06), потому что я изначально думал, что setAuthConfigFile - это все, что было нужно:

$client = new Google_Client();
$client->setApplicationName('MyCalendarAppName');
$client->setAuthConfigFile(APPPATH.'client_secret.json'); //file downloaded from GDC:
//  https://console.developers.google.com/apis/credentials?project=YOUR-PROJECT-ID
$client->addScope(Google_Service_Calendar::CALENDAR_READONLY);
$service = new Google_Service_Calendar($client);

Ошибка на самом деле не из-за «дневного лимита» запросов, а из-за того, что я (владелец аккаунта Google) явно не давал разрешения на доступ к календарю. Вот как это сделать:

  1. получить доступ к URL-адресу, возвращенному методом createAuthUrl() (который можно вызвать перед вызовом службы);
  2. появляется форма «Запретить» и «Разрешить» для доступа к календарям & ndash; нажмите Разрешить ;
  3. код возвращается & ndash; скопируйте и вставьте этот код в метод authenticate($code) и вуаля, не более 403: превышен дневной лимит ошибки.

Для этого просто используйте следующие строки перед вызовом сервиса:

//$client->createAuthUrl();
// - invoke the method above one time only: returns a URL with the "Allow" form
//   which will give the code for authentication
$client->authenticate('YOUR_CODE_GOES_HERE');
$service = new Google_Service_Calendar($client); //invokes the Calendar service

Однако это позволит одноразовый доступ к календарю. Если вы попробуете это дважды, вы получите:

Google_Auth_Exception: Ошибка при получении токена доступа OAuth2, сообщение: «invalid_grant: код уже был погашен."

Это означает, что токен необходим для повторной обработки календаря с восстановленным кодом . Этот токен возвращается методом authenticate и может быть назначен клиенту с помощью метода setAccessToken:

//get the access token you previously stored or get a new one to be stored:
$accessToken = $client->authenticate('YOUR_CODE_GOES_HERE');
//after the if-else blocks...
$client->setAccessToken($accessToken);
//refresh the token if it's expired
if ($client->isAccessTokenExpired())
  $client->refreshToken($client->getRefreshToken());

Цель состоит в том, чтобы многократно использовать этот токен доступа (неявно также повторно использовать выкупленный код) и вызывать refreshToken только после истечения срока действия токена. Быстрый запуск Google создает специальный файл для хранения этого токена (calendar-php-quickstart.json) и использует метод authenticate, только если токен не найден в этом файле. То есть setAccessToken - единственный метод аутентификации Клиента (кроме setAuthConfigFile), который необходимо использовать в последующих запросах.

Я только полностью понял эту логику OAuth 2.0 , пройдя через эти ошибки, и поскольку этот вопрос уже привлек так много людей, возможно, это может помочь другим ...

0 голосов
/ 23 февраля 2012

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

Вы можете либо заменить их идентификаторами клиента и секретными значениями клиента соответственно, что может бытьнаходится на вкладке API Access на странице ваших проектов в Консоли API , или вы можете передать ключ API (находится под токенами авторизации на той же странице), используя дополнительный параметр key.

Это то же самое для большинства API Google .

Источник: http://code.google.com/apis/calendar/v3/using.html#APIKey

...