Я пишу PHP-приложение, которое должно позволить пользователям добавлять определенные события в частный Календарь Google. Календарь принадлежит мне, и мне нужно, чтобы PHP связывался с API-интерфейсом календаря с использованием фиксированных учетных данных (каждый может добавлять события, используя форму на веб-сайте, но сам календарь не является общедоступным).
Из того, что я прочитал, это возможно с помощью ClientLogin в API v1. Однако в API v3 доступны следующие опции: OAuth2.0 или API. Использование ключа API, похоже, не работает, поскольку оно может использоваться только для запросов, для которых не требуется авторизация, и OAuth тоже не кажется правильным, поскольку пользователи не должны получать доступ к своим собственным календарям, но один мой приложение использует.
Я подумал о том, чтобы программный токен OAuth был запрограммирован, но рано или поздно он сломается, так как диалог OAuth может использовать captchas.
Это похоже на такой стандартный вариант использования – веб-приложение, которое позволяет пользователям взаимодействовать с одним календарем некоторыми предопределенными способами, но я не могу найти никакой документации о том, как это произошло в API v3. Может кто-нибудь мне помочь?
Вам нужно будет использовать как ключ разработчика (API-ключ), так и OAuth2. Ключ разработчика проверяет подлинность, кто написал программное обеспечение, и используется для таких вещей, как квота, которая находится на основе каждого разработчика, а не для каждого пользователя. OAuth2 предназначен для аутентификации пользователей и будет необходим доступ к непубличному календарю.
OAuth2 имеет токен обновления, из которого вы можете создать токен сеанса, и это означает, что вам не нужно будет экранировать экраны OAuth, чтобы получить аутентификацию. Чтобы получить это, я бы написал небольшое приложение командной строки или вы использовали одну страницу PHP.
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, и токен обновления должны быть надежно защищены на вашем сервере и никогда не отправляться клиенту, если вы когда-либо отправляли их как часть ответа, ваши клиенты имели бы те же привилегии, что и ваше приложение кода
Я нашел решение, которое, я думаю, является «официальным» за то, что вы хотите сделать.
Во-первых, вам нужно активировать 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)); ?>
Во-первых, скрипт запрашивает «токен доступа», который действителен в течение часа. Затем скрипт получает службу REST (любой в области календаря), отправляя токен доступа в заголовок. Чтобы дать лучшую скорость на скрипте, было бы неплохо сохранить токен доступа в кеше, пока он не станет старше 3600 секунд. Таким образом, сценарий будет избегать одного из двух вызовов.
Советы:
Посетите OAuth 2.0 Playground, чтобы понять всю информацию, отправленную в процессе OAuth. Это мне очень помогло
Сообщение Эрика Нагеля в его блоге дало мне решение. Все его достоинства. Я не могу связать его, так как у меня недостаточно «репутации».
Может также использоваться с библиотекой 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);