API Календаря Google v3 - аутентификация с использованием жестко закодированных учетных данных - PullRequest
19 голосов
/ 24 ноября 2011

Я пишу PHP-приложение, которое должно позволять пользователям добавлять определенные события в личный Календарь Google. Этот календарь принадлежит мне, и мне нужен способ для связи PHP с API календаря с использованием фиксированных учетных данных (каждый может добавлять события с помощью формы на веб-сайте, но сам календарь не является общедоступным).

Из того, что я прочитал, это возможно с помощью ClientLogin в API v1. Однако в API v3 доступны следующие опции: OAuth2.0 или ключ API. Использование ключа API, похоже, не работает, поскольку его можно использовать только для запросов, которые не требуют авторизации, а OAuth тоже не выглядит правильным, поскольку пользователи не должны получать доступ к своим собственным календарям, а тот, который мой приложение использует.

Я думал о том, чтобы получить токен OAuth программно, но он рано или поздно сломается, поскольку в диалоге OAuth могут использоваться капчи.

Похоже, это стандартный сценарий использования - веб-приложение, которое позволяет пользователям взаимодействовать с одним календарем несколькими предопределенными способами - но я не могу найти никакой документации о том, как это сделать в API v3. Кто-нибудь может мне помочь?

Ответы [ 3 ]

28 голосов
/ 06 января 2012

Я нашел решение, которое, по моему мнению, является «официальным» для того, что вы хотите сделать.

Сначала вам нужно активировать Google API «Идентификатор клиента для установленных приложений».

Перейдите в консоль Google API и создайте проект.

Затем активируйте календарь.

Перейдите к опции «Доступ к API» и используйте кнопку «Создать клиента OAuth 2.0».

Дайте название (и логотип, если хотите) продукту.Нажмите «Далее».

Выберите опцию «Установленное приложение» и нажмите «Создать идентификатор клиента».

Теперь у вас настроен доступ.Теперь вам понадобятся некоторые коды.Для их получения:

* «Код аутентификации».Чтобы получить его, вам нужна следующая информация:

ОБЛАСТЬ ПРИМЕНЕНИЯ: https://www.google.com/calendar/feeds/ (если вы хотите получить доступ к API календаря. Есть и другие, вы можете найти их на OAuth 2.0 Playground)

CLIENT_ID: вы найдете его в разделе доступа к API на консоли Google API.

REDIRECT_URI: получите его в том же месте.

Теперь скопируйте следующий код в файлпоместите значения в переменные, выполните код (php -q script_name.php) и перейдите к напечатанному URL.

<?php
$scope         =   '';
$client_id      =   '';
$redirect_uri   =   '';

$params = array(
                    'response_type' =>   'code',
                    'client_id'     =>   $client_id,
                    'redirect_uri'  =>   $redirect_uri,
                    'scope'         =>   $scope
                    );
$url = 'https://accounts.google.com/o/oauth2/auth?' . http_build_query($params);        
echo $url."\n";
?>

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

* «Обновить код».Чтобы получить его, вам потребуется:

Данные, которые вы использовали ранее, а также код «секрет клиента» в консоли API, между «идентификатором клиента» и «URI перенаправления».

Как и раньше, скопируйте следующий код и поместите переменные на место (поле кода - это код аутентификации).Выполните, и в результате появится «Обновить токен».

<?php
$url = 'https://accounts.google.com/o/oauth2/token';
$post_data = array(
                    'code'          =>   '',
                    'client_id'     =>   '',
                    'client_secret' =>   '',
                    'redirect_uri'  =>   '',
                    'grant_type'    =>   'authorization_code',
                    );
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);
$token = json_decode($result);

echo $token->refresh_token . "\n";
?>

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

Чтобы получить доступ к службе календаря, здесь у вас есть пример: Измените значения переменной перед ее использованием.В этом примере получаются основные события календаря, но вы можете изменить адрес для любого в API календаря (http://code.google.com/intl/ca/apis/calendar/v3/getting_started.html#background_operations)

    <?php
    $scope         =   'https://www.google.com/calendar/feeds/';
    $client_id      =   '';
    $client_secret  =   '';
    $redirect_uri   =   '';


    $refresh_token  =   '';

    $token_url = 'https://accounts.google.com/o/oauth2/token';
    $post_data = array(
                        'client_secret' =>   $client_secret,
                        'grant_type'    =>   'refresh_token',
                        'refresh_token' =>   $refresh_token,
                        'client_id'     =>   $client_id
                        );
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $token_url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $result = curl_exec($ch);
    $token_object = json_decode($result);
    $access_token = $token_object->access_token;

    // Get the results
    $rest_url = 'https://www.googleapis.com/calendar/v3/calendars/primary/events';
    $header = "Authorization: OAuth " . $access_token;

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_HTTPHEADER, array($header));
    curl_setopt($ch, CURLOPT_URL, $rest_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $rest_result = curl_exec($ch);

    print_r(json_decode($rest_result));
    ?>

Сначала сценарий запрашивает «токен доступа», который действителен длячас. Затем скрипт получает сервис REST (любой в области календаря), отправляя токен доступа в заголовке. Чтобы обеспечить лучшую скорость работы скрипта, было бы хорошо хранить токен доступа в кэше, пока он не станет старше.3600 секунд. Таким образом, сценарий избежит одного из двух вызовов.

Советы:

Посетите игровую площадку OAuth 2.0, чтобы понять всю информацию, отправленную в процессе OAuth.lot

Сообщение Эрика Нагеля в его блоге дало мне решение. Вся заслуга в нем. Я не могу связать это, так как у меня недостаточно «репутации».

13 голосов
/ 25 ноября 2011

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

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

  1. Под Консоль Google Api перейдите в API Access
  2. Сгенерируйте новый идентификатор клиента и выберите Установленное приложение (так как вы будете аутентифицировать свой сервер, а не как своего пользователя)
  3. Либо с помощью консольного приложения, либо с отдельной страницей PHP, аутентифицируйтесь с помощью OAuth и вашей учетной записи Google (тот, с календарем, к которому вы хотите получить доступ)
  4. В ответе от аутентификации должен быть токен пролонгации (называемый продлением или обновлением или что-то подобное).Сохраните эту строку и сделайте ее доступной для вашего сайта PHP.
  5. Когда вам нужен доступ к сервису, в вашей библиотеке OAuth должен быть вызов на обновление / обновление.Ниже приведен пример использования .Net.

private IAuthorizationState CreateAuthorization(NativeApplicationClient arg)
 {
   // Get the auth URL:
   IAuthorizationState state = new AuthorizationState(new[] { AdsenseService.Scopes.AdsenseReadonly.GetStringValue() });
   state.Callback = new Uri(NativeApplicationClient.OutOfBandCallbackUrl);
   if (refreshToken.IsNotNullOrEmpty()) // refreshToken you stored in step 4
   {
     try
     {
       state.RefreshToken = refreshToken;
       if (arg.RefreshToken(state))     // This is calling out to the OAuth servers with the refresh token getting back a session token, returns true if successful.
       {
         if (state.RefreshToken != refreshToken) // if the refresh token has changed, save it.
         {
           PersistRefreshToken(authorization.RefreshToken);
         }
         return this.authorization = state; // Retain the authorization state, this is what will authenticate your calls.
       }
     }
     catch (ProtocolException ex) {...}

Обновленный AuthorisationState можно затем использовать для аутентификации вызова, который вы делаете в API.это состояние может использоваться много раз, пока оно не истечет, а затем может быть обновлено.Поскольку вы аутентифицируете свое приложение как себя, а не как пользователя, это AuthorisationState может быть доступно всем вашим сеансам.И текущий AuthorisationState, и токен обновления должны храниться на вашем сервере надежно и никогда не отправляться клиенту. Если вы отправите их как часть ответа, ваши клиенты будут иметь те же привилегии, что и ваше приложение кода

2 голосов
/ 14 июля 2012

Может также использоваться с библиотекой Google php. Маркер доступа для функции $client->setAccessToken() должен быть отформатирован следующим образом:

$at= '{"access_token":"' . $access_token . '",' .
      '"token_type":"Bearer",' .
      '"expires_in":3600,' .
      '"refresh_token":"' . $refresh_token . '",',
      '"created":' . time() . '}';

Где $access_token - найденный вами токен доступа, а $refresh_token - токен обновления. Протестировано на бесполезном примере google simple.php.

Аутентификация тогда просто:

$client->setAccessToken($at);
...