Подтвердить что ты не робот

API календаря Google v3 - аутентификация с помощью жестко настроенных учетных данных

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

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

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

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

4b9b3361

Ответ 1

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

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

  • В Google Api Console перейдите к API Access
  • Создайте новый идентификатор клиента и выберите "Установленное приложение" (так как вы будете аутентифицировать ваш сервер так же, как и ваш пользователь).
  • Либо использовать консольное приложение, либо одну профайле аутентификации PHP, используя OAuth и вашу учетную запись google (та, с которой вы хотите получить доступ к календарю)
  • В возврате от аутентификации должен быть токен обновления (называемый обновлением или обновлением или чем-то похожим). Сохраните эту строку и сделайте ее доступной для вашего сайта PHP.
  • Когда вам нужно получить доступ к службе, ваша библиотека 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

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

Во-первых, вам нужно активировать API-интерфейс Google API для установленных приложений.

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

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

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

Дайте имя (и логотип, если хотите) для продукта. Нажмите "Далее".

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

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

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

SCOPE: https://www.google.com/calendar/feeds/ (если вы хотите получить доступ к API календаря. Есть и другие, которые вы можете найти на игровой площадке OAuth 2.0)

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

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));
    ?>

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

Советы:

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

Сообщение Eric Nagel в своем блоге дало мне решение. Все его достоинства. Я не могу связать его, так как у меня недостаточно "репутации".

Ответ 3

Также можно использовать библиотеку 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);