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