Внимание : Эта страница посвящена старым API Google, Google Data API; она актуальна только для API, перечисленных в каталоге Google Data APIs, многие из которых были заменены более новыми API. Информацию о конкретном новом API см. в документации к нему. Информацию об авторизации запросов с использованием более нового API см. в разделе «Аутентификация и авторизация учетных записей Google» .
В этом документе описывается, как использовать клиентские библиотеки Google Data API для подключения к системе аутентификации OAuth от Google для веб-приложений .
Интерфейс OAuth позволяет веб-приложению получать доступ к сервису Google от имени пользователя. Для обеспечения высокого уровня безопасности OAuth позволяет приложению получать токен доступа, не обрабатывая при этом информацию для входа в учетную запись пользователя.
Клиентские библиотеки Google Data API предоставляют методы, которые помогут вам использовать OAuth в вашем веб-приложении. В частности, существуют методы для получения токена запроса, авторизации токена запроса и обмена авторизованного токена запроса на токен доступа. Библиотеки также обрабатывают необходимые алгоритмы подписи при отправке запросов к сервису Google Data.
Аудитория
Этот документ предназначен для программистов, которые хотят, чтобы их веб-приложения получали доступ к сервисам Google от имени пользователей, используя клиентские библиотеки Google Data API.
В этом документе предполагается, что вы знакомы с интерфейсом OAuth и общим процессом интеграции OAuth в ваше веб-приложение. Полное описание протокола OAuth см. в разделе «Аутентификация OAuth для веб-приложений» или в официальной спецификации на сайте oauth.net .
Использование трехэтапной аутентификации OAuth и API данных Google без клиентских библиотек.
Если вы хотите, чтобы ваше веб-приложение взаимодействовало со службой Google Data, используя OAuth в качестве метода авторизации, то вся необходимая информация содержится в документе «Аутентификация OAuth для веб-приложений» . Использовать клиентские библиотеки Google Data API необязательно, если вы этого не хотите.
Вот пример того, как ваше приложение может аутентифицировать пользователя с помощью OAuth:
- Ваше приложение отправляет подписанный запрос на получение начального токена запроса OAuth из конечной точки
OAuthRequestToken. - Ваше приложение перенаправляет пользователя на соответствующий URL-адрес
OAuthAuthorizeTokenдля авторизации запрошенного токена. - После предоставления доступа пользователь перенаправляется обратно в ваше приложение (на URL-адрес
oauth_callback). - Ваше приложение отправляет подписанный запрос на обновление авторизованного токена запроса до токена доступа, используя конечную точку
OAuthGetAccessToken.
Клиентские библиотеки Google Data API упрощают этот процесс авторизации, обрабатывая различные детали за вас. В этом документе объясняется, как это работает.
Регистрация вашего веб-приложения
OAuth требует, чтобы все вызовы API были подписаны цифровой подписью. Google поддерживает методы подписи HMAC-SHA1 и RSA-SHA1 . Для подписи запросов вашему приложению сначала необходимо зарегистрироваться в Google . После регистрации Google предоставит вам ключ потребителя (и секрет для использования с HMAC-SHA1 ), а также место для загрузки открытого сертификата.
1. Регистрация вашего домена
Пожалуйста, следуйте инструкциям, изложенным в разделе «Регистрация для веб-приложений» .
2. Создание пары закрытый ключ / открытый сертификат (необязательно)
Если вы решите использовать RSA-SHA1 в качестве метода oauth_signature_method , вам потребуется создать пару самоподписываемого закрытого ключа RSA и открытого сертификата. Примеры того, как это сделать, см. в разделе «Генерация самоподписываемого закрытого ключа и открытого сертификата» (ниже).
Работа с трехэтапной аутентификацией OAuth и API данных Google: примеры использования клиентской библиотеки.
В следующих разделах приведены примеры использования методов клиентской библиотеки Google Data API в соответствии с шагами, описанными в разделе « Работа с OAuth » документации OAuth. Все примеры в этом документе предполагают, что домен хоста вашего приложения — example.com .
Определение объема доступа к вашим данным.
Для каждого сервиса Google определяется значение scope , которое определяет доступ токена к данным пользователя. Доступные значения параметра scope перечислены в разделе часто задаваемых вопросов (FAQ) по данным Google . Например, чтобы использовать API списка документов, установите scope на https://docs.google.com/feeds/ , как указано в разделе FAQ .
Примечание : Установите значение scope на самый узкий URL-адрес, разрешающий необходимый вам доступ. Это снижает вероятность случайного получения и утечки личных данных. Например, если вы хотите получить доступ к закрытой ленте списка документов текущего пользователя, используйте scope https://docs.google.com/feeds/default/private/full вместо более широкого scope, такого как https://docs.google.com/feeds/ , который предоставляет доступ ко всем лентам списка документов.
Токены с несколькими областями действия
Чтобы создать токены, обеспечивающие доступ к нескольким API данных Google, разделяйте области действия пробелом. В приведенном ниже примере создается токен с доступом как к данным Google Документов, так и к данным Google Календаря пользователя.
scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
URL-кодирование
Несимволы ASCII, встречающиеся в URL-адресах, включая двоеточие, косую черту и пробел, должны быть закодированы в формате URL для передачи по протоколу HTTP. Клиентские библиотеки Google Data API автоматически кодируют параметры в формате URL, поэтому вы можете просто использовать незакодированные в формате URL строки при присваивании значений параметрам. Например, вы можете выполнить следующее присваивание в своем коде:
scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
При вызове клиентской библиотеки параметр
scope автоматически кодируется в URL-формате и принимает следующее значение: https%3a%2f%2fwww.google.com%2fcalendar%2ffeeds%2f+https%3a%2f%2fdocs.google.com%2ffeeds%2f
Получение токена запроса
Java
Для HMAC-SHA1 необходим способ сохранения секретного ключа токена (полученного в ответе), чтобы создать объект токена OAuth, возвращаемый со страницы подтверждения. Для этого можно установить переменную сессии или cookie.
import com.google.gdata.client.docs.*; import com.google.gdata.client.authn.oauth.*; String CONSUMER_KEY = "example.com"; String CONSUMER_SECRET = "abc123doremi"; GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); oauthParameters.setScope("https://docs.google.com/feeds/"); oauthParameters.setOAuthCallback("http://www.example.com/UpgradeToken.jsp"); GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthHmacSha1Signer()); oauthHelper.getUnauthorizedRequestToken(oauthParameters);
При использовании RSA-SHA1 параметр oauth_token_secret не используется, поэтому нет необходимости сохранять секретный токен.
import com.google.gdata.client.docs.*; import com.google.gdata.client.authn.oauth.*; String CONSUMER_KEY = "example.com"; GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); oauthParameters.setScope("https://docs.google.com/feeds/"); oauthParameters.setOAuthCallback("http://www.example.com/UpgradeToken.jsp"); PrivateKey privKey = getPrivateKey("/path/to/your/rsakey.pk8"); GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthRsaSha1Signer(privKey)); oauthHelper.getUnauthorizedRequestToken(oauthParameters); ... public static PrivateKey getPrivateKey(String privKeyFileName) { File privKeyFile = new File(privKeyFileName); FileInputStream fis = new FileInputStream(privKeyFile); DataInputStream dis = new DataInputStream(fis); byte[] privKeyBytes = new byte[(int) privKeyFile.length()]; dis.read(privKeyBytes); dis.close(); fis.close(); String BEGIN = "-----BEGIN PRIVATE KEY-----"; String END = "-----END PRIVATE KEY-----"; String str = new String(privKeyBytes); if (str.contains(BEGIN) && str.contains(END)) { str = str.substring(BEGIN.length(), str.lastIndexOf(END)); } KeyFactory fac = KeyFactory.getInstance("RSA"); EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(Base64.decode(str)); return fac.generatePrivate(privKeySpec); }
PHP
Использование HMAC-SHA1 в качестве метода подписи:
require_once 'Zend/Oauth/Consumer.php'; session_start(); $CONSUMER_KEY = 'example.com'; $CONSUMER_SECRET = 'abc123doremi'; // Multi-scoped token. $SCOPES = array( 'https://docs.google.com/feeds/', 'https://spreadsheets.google.com/feeds/' ); $oauthOptions = array( 'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER, 'version' => '1.0', 'consumerKey' => $CONSUMER_KEY, 'consumerSecret' => $CONSUMER_SECRET, 'signatureMethod' => 'HMAC-SHA1', 'callbackUrl' => 'http://myapp.example.com/access_token.php', 'requestTokenUrl' => 'https://www.google.com/accounts/OAuthGetRequestToken', 'userAuthorizationUrl' => 'https://www.google.com/accounts/OAuthAuthorizeToken', 'accessTokenUrl' => 'https://www.google.com/accounts/OAuthGetAccessToken' ); $consumer = new Zend_Oauth_Consumer($oauthOptions); // When using HMAC-SHA1, you need to persist the request token in some way. // This is because you'll need the request token's token secret when upgrading // to an access token later on. The example below saves the token object as a session variable. if (!isset($_SESSION['ACCESS_TOKEN'])) { $_SESSION['REQUEST_TOKEN'] = serialize($consumer->getRequestToken(array('scope' => implode(' ', $SCOPES)))); }
Использование RSA-SHA1 в качестве метода подписи:
require_once 'Zend/Crypt/Rsa/Key/Private.php'; require_once 'Zend/Oauth/Consumer.php'; session_start(); $CONSUMER_KEY = 'example.com'; $SCOPE = 'https://docs.google.com/feeds/'; $oauthOptions = array( 'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER, 'version' => '1.0', 'consumerKey' => $CONSUMER_KEY, 'consumerSecret' => new Zend_Crypt_Rsa_Key_Private(file_get_contents(realpath('/path/to/yourRSAPrivateKey.pem'))), 'signatureMethod' => 'RSA-SHA1', 'callbackUrl' => 'http://myapp.example.com/access_token.php', 'requestTokenUrl' => 'https://www.google.com/accounts/OAuthGetRequestToken', 'userAuthorizationUrl' => 'https://www.google.com/accounts/OAuthAuthorizeToken', 'accessTokenUrl' => 'https://www.google.com/accounts/OAuthGetAccessToken' ); $consumer = new Zend_Oauth_Consumer($oauthOptions); if (!isset($_SESSION['ACCESS_TOKEN'])) { $_SESSION['REQUEST_TOKEN'] = serialize($consumer->getRequestToken(array('scope' => $SCOPE))); }
Python
Использование HMAC-SHA1 в качестве метода подписи:
Если вы используете более новые классы версии 2.0 и выше, основанные на GDClient , используйте:
import gdata.gauth import gdata.docs.client CONSUMER_KEY = 'example.com' CONSUMER_SECRET = 'abc123doremi' SCOPES = ['https://docs.google.com/feeds/', 'https://www.google.com/calendar/feeds/'] # example of a multi-scoped token client = gdata.docs.client.DocsClient(source='yourCompany-YourAppName-v1') oauth_callback_url = 'http://%s/get_access_token' % self.request.host request_token = client.GetOAuthToken( SCOPES, oauth_callback_url, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET) # When using HMAC-SHA1, you need to persist the request_token in some way. # You'll need the token secret when upgrading to an access token later on. # In Google App Engine, you can use the AeSave helper: # gdata.gauth.AeSave(request_token, 'myKey')
Использование RSA-SHA1 в качестве метода подписи:
... f = open('/path/to/yourRSAPrivateKey.pem') RSA_KEY = f.read() f.close() request_token = client.GetOAuthToken(SCOPES, oauth_callback_url, CONSUMER_KEY, rsa_private_key=RSA_KEY)
В качестве альтернативы, если вы используете более старые классы версии 1.0, основанные на GDataService , вызовы будут немного отличаться:
import gdata.auth import gdata.docs.service CONSUMER_KEY = 'example.com' CONSUMER_SECRET = 'abc123doremi' client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1') client.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET) req_token = client.FetchOAuthRequestToken() client.SetOAuthToken(req_token)
Использование RSA-SHA1 в качестве метода подписи:
... f = open('/path/to/yourRSAPrivateKey.pem') RSA_KEY = f.read() f.close() client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1') client.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.RSA_SHA1, CONSUMER_KEY, rsa_key=RSA_KEY) SCOPES = ['https://docs.google.com/feeds/', 'https://www.google.com/calendar/feeds/'] # example of a multi-scoped token req_token = client.FetchOAuthRequestToken(scopes=SCOPES) client.SetOAuthToken(req_token)
.СЕТЬ
Использование HMAC-SHA1 в качестве метода подписи:
using Google.GData.Client; string CONSUMER_KEY = "example.com"; string CONSUMER_SECRET = "abc123doremi"; // Multi-scoped token. string SCOPE = "https://www.google.com/calendar/feeds/ https://www.google.com/m8/feeds/"; OAuthParameters parameters = new OAuthParameters() { ConsumerKey = CONSUMER_KEY, ConsumerSecret = CONSUMER_SECRET, Scope = SCOPE, Callback = "http://myapp.example.com/access_token", SignatureMethod = "HMAC-SHA1" } OAuthUtil.GetUnauthorizedRequestToken(parameters);
Использование RSA-SHA1 в качестве метода подписи:
RSA-SHA1 is not supported yet.
Авторизация токена запроса
Для авторизации токена запроса ваше приложение должно перенаправить пользователя на URL-адрес OAuthAuthorizeToken , который предложит ему войти в свою учетную запись Google. Дополнительную информацию об URL-адресе OAuthAuthorizeToken см. в полной версии документа «Аутентификация OAuth для веб-приложений» .
Для создания URL-адреса OAuthAuthorizeToken в вашем приложении используйте следующий код для каждой клиентской библиотеки. Обратите внимание, что эти примеры основаны на предыдущих примерах.
После формирования URL-адреса страницы подтверждения ваше приложение может использовать его различными способами для перенаправления пользователя на обработчик OAuthAuthorizeToken . Наиболее распространенный подход — перенаправление пользователя или отображение ссылки на эту страницу.
Java
Для HMAC-SHA1 :
String approvalPageUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters); System.out.println(approvalPageUrl);
Для RSA-SHA1 :
String approvalPageUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters); System.out.println(approvalPageUrl);
PHP
// If on a G Suite domain, use your domain for the hd param (e.g. 'example.com'). $approvalUrl = $consumer->getRedirectUrl(array('hd' => 'default')); echo "<a href=\"$approvalUrl\">Grant access</a>";
В качестве альтернативы вы можете просто перенаправить пользователя на URL-адрес для подтверждения:
// If on a G Suite domain, use your domain for the hd param (e.g. 'example.com'). $consumer->redirect(array('hd' => 'default'));
Python
Если вы используете более новые классы версии 2.0 и выше, основанные на GDClient , используйте:
# req_token is from previous call to client.GetOAuthToken() domain = None # If on a G Suite domain, use your domain (e.g. 'example.com'). self.redirect(request_token.generate_authorization_url(google_apps_domain=domain))
Если вы используете более старые классы версии 1.0, основанные на GDataService , процесс немного отличается.
# req_token is from previous call to client.FetchOAuthRequestToken() oauth_callback_url = 'http://%s/get_access_token' % self.request.host self.redirect(client.GenerateOAuthAuthorizationURL(callback_url=oauth_callback_url))
.СЕТЬ
string authorizationUrl = OAuthUtil.CreateUserAuthorizationUrl(parameters); Console.WriteLine(authorizationUrl);
Извлечение токена из URL-адреса обратного вызова
Когда Google перенаправляет пользователя обратно в ваше приложение, oauth_token добавляется к URL-адресу " oauth_callback_url " в качестве параметра запроса. Затем ваше приложение должно извлечь значение токена из параметра запроса URL-адреса и восстановить параметры OAuth.
Клиентские библиотеки предоставляют удобные методы для извлечения oauth_token . Эти примеры основаны на предыдущих примерах.
Java
Если вы выбрали сохранение секретного токена в URL-адресе обратного вызова (при использовании HMAC-SHA1 ):
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthHmacSha1Signer()); oauthHelper.getOAuthParametersFromCallback(request.getQueryString(), oauthParameters);
Единственное отличие от RSA-SHA1 заключается в методе подписи:
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); PrivateKey privKey = getPrivateKey("/path/to/your/rsakey.pk8"); GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthRsaSha1Signer(privKey)); oauthHelper.getOAuthParametersFromCallback(request.getQueryString(), oauthParameters);
PHP
Этот шаг не требуется при использовании PHP-библиотеки.
Python
Если вы используете более новые классы версии 2.0 и выше, основанные на GDClient , используйте:
# Recall request_token. In Google App Engine, use AeLoad(): # saved_request_token = gdata.gauth.AeLoad('myKey') request_token = gdata.gauth.AuthorizeRequestToken(saved_request_token, self.request.uri)
Если вы используете более старые классы версии 1.0, основанные на GDataService , используйте:
oauth_token = gdata.auth.OAuthTokenFromUrl(self.request.uri) if oauth_token: oauth_token.secret = # TODO: recall saved request_token and set the token secret here. oauth_token.oauth_input_params = gdata.auth.OAuthInputParams( gdata.auth.OAuthSignatureMethod.HMAC_SHA1, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET) client.SetOAuthToken(oauth_token) else: print 'No oauth_token found in the URL'
Для RSA-SHA1 процесс аналогичен, но без секретного токена:
oauth_token = gdata.auth.OAuthTokenFromUrl(self.request.uri) if oauth_token: oauth_token.oauth_input_params = gdata.auth.OAuthInputParams( gdata.auth.OAuthSignatureMethod.RSA_SHA1, CONSUMER_KEY, rsa_key=RSA_KEY) client.SetOAuthToken(oauth_token) else: print 'No oauth_token found in the URL'
.СЕТЬ
Если вы выбрали сохранение секретного токена в URL-адресе обратного вызова:
OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);
Обновление до токена доступа
Последним шагом в процессе получения токена OAuth является преобразование авторизованного токена запроса в долговременный токен доступа с помощью URL-адреса OAuthGetAccessToken , как описано в полной документации по аутентификации OAuth для веб-приложений .
Вот несколько примеров использования каждой из клиентских библиотек:
Java
String accessToken = oauthHelper.getAccessToken(oauthParameters); // You can also pull the OAuth token string from the oauthParameters: // String accessToken = oauthParameters.getOAuthToken(); System.out.println("OAuth Access Token: " + accessToken); String accessTokenSecret = oauthParameters.getOAuthTokenSecret(); System.out.println("OAuth Access Token's Secret: " + accessTokenSecret);
PHP
if (!isset($_SESSION['ACCESS_TOKEN'])) { if (!empty($_GET) && isset($_SESSION['REQUEST_TOKEN'])) { $_SESSION['ACCESS_TOKEN'] = serialize($consumer->getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN']))); } }
Python
Если вы используете более новые классы версии 2.0 и выше, основанные на GDClient , используйте:
# Upgrade the token and save in the user's datastore access_token = client.GetAccessToken(request_token) # If you're using Google App Engine, you can call the AeSave() method to save # the access token under the current logged in user's account. #gdata.gauth.AeSave(access_token, token_key)
Если вы используете более старые классы версии 1.0, основанные на GDataService , используйте:
access_token = client.UpgradeToOAuthAccessToken() # calls SetOAuthToken() for you
Если вы используете gdata.gauth.AeSave() в App Engine, токен и секретный ключ токена будут сохранены для вас под текущим авторизованным пользователем.
.СЕТЬ
OAuthUtil.GetAccessToken(parameters); // If you want to extract the OAuth Token/TokenSecret from the OAuthParameters instance: string accessToken = parameter.Token; Console.WriteLine("OAuth Access Token: " + accessToken); string accessTokenSecret = parameter.TokenSecret; Console.WriteLine("OAuth Access Token's Secret: " + accessTokenSecret);
Примечание : Если вы используете HMAC-SHA1 , обязательно сохраните секретный ключ токена доступа вместе со значением токена в вашей базе данных, иначе вы не сможете корректно восстановить параметры OAuth для дальнейшего использования.
Использование токена доступа
После получения токена доступа используйте стандартные вызовы клиентской библиотеки Google Data API для взаимодействия со службой. Библиотека позаботится о подписании запросов и добавлении правильного заголовка Authorization. Как правило, вам потребуется получить токен пользователя из cookie или базы данных. В этих примерах показано, как восстановить параметры OAuth и выполнить вызов клиентской библиотеки.
Java
Если вы используете HMAC-SHA1 :
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); oauthParameters.setOAuthToken(ACCESS_TOKEN); oauthParameters.setOAuthTokenSecret(TOKEN_SECRET); DocsService client = new DocsService("yourCompany-YourAppName-v1"); client.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer()); URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full"); DocumentListFeed resultFeed = client.getFeed(feedUrl, DocumentListFeed.class); for (DocumentListEntry entry : resultFeed.getEntries()) { System.out.println(entry.getTitle().getPlainText()); }
Отличие от RSA-SHA1 заключается в том, что вам не нужно задавать секретный ключ токена доступа, и создание объекта подписывающего лица происходит по-другому:
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); oauthParameters.setOAuthToken(ACCESS_TOKEN); PrivateKey privKey = getPrivateKey("/path/to/your/rsakey.pk8"); // See above for the defintion of getPrivateKey() DocsService client = new DocsService("yourCompany-YourAppName-v1"); client.setOAuthCredentials(oauthParameters, new OAuthRsaSha1Signer(privKey)); URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full"); DocumentListFeed resultFeed = client.getFeed(feedUrl, DocumentListFeed.class); for (DocumentListEntry entry : resultFeed.getEntries()) { System.out.println(entry.getTitle().getPlainText()); }
PHP
require_once 'Zend/Gdata/Docs.php'; if (isset($_SESSION['ACCESS_TOKEN'])) { $accessToken = unserialize($_SESSION['ACCESS_TOKEN']); } else { exit; } /* Or, you could set an existing token (say one stored from your database). For HMAC-SHA1: $accessToken = new Zend_Oauth_Token_Access(); $accessToken->setToken('1/AQfoI-qJDqkvvkf216Gc2g'); $accessToken->setTokenSecret('2c26GLW250tZiQ'); */ $httpClient = $accessToken->getHttpClient($oauthOptions); $client = new Zend_Gdata_Docs($httpClient, "yourCompany-YourAppName-v1"); // Retrieve user's list of Google Docs $feed = $client->getDocumentListFeed(); foreach ($feed->entries as $entry) { echo "$entry->title\n"; }
Python
Этот фрагмент кода предполагает, что вы уже получили токен доступа (используя HMAC-SHA1 ) и хотите использовать этот ключ/секрет токена в дальнейшем.
Если вы используете более новые классы версии 2.0 и выше, основанные на GDClient , используйте:
client = gdata.docs.client.DocsClient(source='yourCo-yourAppName-v1') client.auth_token = gdata.gauth.OAuthHmacToken(CONSUMER_KEY, CONSUMER_SECRET, TOKEN, TOKEN_SECRET, gdata.gauth.ACCESS_TOKEN) feed = client.GetDocList() for entry in feed.entry: print entry.title.text
Если вы используете более старые классы версии 1.0, основанные на GDataService , используйте:
client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1') client.SetOAuthInputParameters(SIG_METHOD, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET) # the token key and secret should be recalled from your database client.SetOAuthToken(gdata.auth.OAuthToken(key=TOKEN, secret=TOKEN_SECRET)) feed = client.GetDocumentListFeed() for entry in feed.entry: print entry.title.text
.СЕТЬ
Если вы используете HMAC-SHA1 :
OAuthParameters parameters = new OAuthParameters() {
ConsumerKey = CONSUMER_KEY,
ConsumerSecret = CONSUMER_SECRET,
Token = ACCESS_TOKEN,
TokenSecret = TOKEN_SECRET
}
GOAuthRequestFactory requestFactory = new GOAuthRequestFactory("writely", APPLICATION_NAME, parameters);
DocsService service = new DocsService(APPLICATION_NAME);
service.RequestFactory = requestFactory;
DocumentsListQuery query = new DocumentsListQuery();
DocumentsFeed feed = service.Query(query);
foreach (DocumentEntry entry in feed.Entries) {
Console.WriteLine(entry.Title.Text);
}Отличие от RSA-SHA1 заключается в том, что вам не нужно задавать секретный ключ токена доступа, и создание объекта подписывающего лица происходит по-другому:
RSA-SHA1 is not supported yet.
Дополнительные ресурсы и примеры трехэтапной аутентификации OAuth.
- Примеры использования OAuth в блоге Google Data API Tips
- Статья: Использование OAuth с API данных Google
- Пример клиентской библиотеки на Python
- Пример клиентской библиотеки Python для Google App Engine.
- Пример клиентской библиотеки на Java.
- Пример клиентской библиотеки Java для Google App Engine.
- Пример клиентской библиотеки Zend PHP
- Документация по аутентификации OAuth для веб-приложений
- Документация OAuth.net
2-ножная OAuth
Двухэтапная аутентификация OAuth позволяет доверенным приложениям получать доступ к данным Google пользователей без их непосредственного участия. Двухэтапную аутентификацию OAuth могут использовать две ключевые группы:
Администраторы домена G Suite: Администраторы могут создавать скрипты и пользовательские приложения для управления данными пользователей своего домена с помощью API данных Google. Чтобы узнать об управлении ключом и секретом, связанными с вашим доменом G Suite, и предоставлении глобального контроля доступа, см. раздел «Управление ключом и секретом OAuth» .
Сторонние разработчики программного обеспечения: Поставщики могут предлагать приложения, использующие двухэтапную аутентификацию OAuth для интеграции с G Suite. Доступ к приложениям сторонних разработчиков может быть предоставлен на странице управления API-клиентом или путем установки из G Suite Marketplace.
В соответствии со стандартным процессом авторизации (также называемым трехэтапной OAuth) токен доступа не требуется.
Приведенные ниже примеры клиентской библиотеки демонстрируют, как настроить клиент для использования двухэтапной аутентификации OAuth с помощью HMAC-SHA1 .
Java
import com.google.gdata.client.docs.*; import com.google.gdata.client.authn.oauth.*; String CONSUMER_KEY = "example.com"; String CONSUMER_SECRET = "abc123doremi"; GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); DocsService client = new DocsService("yourCompany-YourAppName-v1"); client.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer()); // Retrieve user's list of Google Docs String user = "any.user@anydomain.com"; URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full" + "?xoauth_requestor_id=" + user); DocumentListFeed resultFeed = client.getFeed(feedUrl, DocumentListFeed.class); for (DocumentListEntry entry : resultFeed.getEntries()) { System.out.println(entry.getTitle().getPlainText()); }
PHP
require_once 'Zend/Oauth/Consumer.php'; require_once 'Zend/Gdata/Docs.php'; $CONSUMER_KEY = 'example.com'; $CONSUMER_SECRET = 'abc123doremi'; $USER = 'any.user@anydomain.com'; $oauthOptions = array( 'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER, 'version' => '1.0', 'signatureMethod' => 'HMAC-SHA1', 'consumerKey' => $CONSUMER_KEY, 'consumerSecret' => $CONSUMER_SECRET ); $consumer = new Zend_Oauth_Consumer($oauthOptions); $token = new Zend_Oauth_Token_Access(); $httpClient = $token->getHttpClient($oauthOptions); $client = new Zend_Gdata_Docs($httpClient); // Retrieve user's list of Google Docs $feed = $client->getDocumentListFeed('https://docs.google.com/feeds/default/private/full?xoauth_requestor_id=' . urlencode($USER)); foreach ($feed->entries as $entry) { echo "$entry->title\n"; }
Python
Если вы используете более новые классы версии 2.0 и выше, основанные на GDClient , используйте:
import gdata.gauth import gdata.docs.client CONSUMER_KEY = 'example.com' CONSUMER_SECRET = 'abc123doremi' requestor_id = 'any.user@anydomain.com' client = gdata.docs.client.DocsClient(source='yourCompany-YourAppName-v1') client.auth_token = gdata.gauth.TwoLeggedOAuthHmacToken( CONSUMER_KEY, CONSUMER_SECRET, requestor_id) # Retrieve user's list of Google Docs feed = client.GetDocList() for entry in feed.entry: print entry.title.text
Если вы используете более старые классы версии 1.0, основанные на GDataService , используйте:
import gdata.auth import gdata.docs.service CONSUMER_KEY = 'example.com' CONSUMER_SECRET = 'abc123doremi' SIG_METHOD = gdata.auth.OAuthSignatureMethod.HMAC_SHA1 requestor_id = 'any.user@anydomain.com' client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1') client.SetOAuthInputParameters(SIG_METHOD, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET, two_legged_oauth=True, requestor_id=requestor_id) # Retrieve user's list of Google Docs feed = client.GetDocumentListFeed() for entry in feed.entry: print entry.title.text # Change to another user on your domain client.GetOAuthInputParameters().requestor_id = 'another.user@example.com'
.СЕТЬ
using Google.GData.Client; using Google.GData.Documents; // Create an OAuth factory to use GOAuthRequestFactory requestFactory = new GOAuthRequestFactory("writely", "yourCompany-YourAppName-v1"); requestFactory.ConsumerKey = "example.com"; requestFactory.ConsumerSecret = "abc123doremi"; String user = "any.user@anydomain.com"; DocumentsService client = new DocumentsService("yourCompany-YourAppName-v1"); client.RequestFactory = requestFactory; // Retrieve user's list of Google Docs DocumentsListQuery query = new DocumentsListQuery(); query.Uri = new OAuthUri("https://docs.google.com/feeds/default/private/full", user, requestFactory.ConsumerKey); DocumentsFeed feed = client.Query(query); foreach (DocumentEntry entry in feed.Entries) { Console.WriteLine(entry.Title.Text); }
Дополнительные ресурсы и примеры двухэтапной аутентификации OAuth.
- Примеры двухэтапной аутентификации OAuth в блоге Google Data API Tips
- Пример использования двухэтапной OAuth в клиентской библиотеке Java.
- Клиентская библиотека Python TwoLeggedOAuthExample (для классов client.py) или пример 2_legged_oauth (для классов service.py)
- Пример двухэтапной аутентификации OAuth для клиентской библиотеки .NET
- Документация по двухэтапной аутентификации OAuth
Генерация самоподписывающего закрытого ключа и открытого сертификата.
Закрытый ключ используется для генерации подписи, которую необходимо прилагать к каждому запросу. Открытый ключ, встроенный в сертификат, используется Google для проверки подписи. Открытый ключ должен представлять собой 1024-битный ключ RSA, закодированный в сертификате X.509 в формате PEM. Сертификат следует отправить в Google во время регистрации.
В следующих разделах приведены примеры генерации ключей и сертификатов с использованием двух конкретных инструментов: утилиты OpenSSL и утилиты keytool из Java.
Эти примеры не относятся исключительно к API данных Google; вы можете использовать те же утилиты для генерации ключей для любых целей.
В примерах предполагается, что ваша компания называется My_Company, находится в городе Маунтин-Вью, штат Калифорния, США, и имеет доменное имя example.com.
Генерация ключей с использованием OpenSSL
Для создания пары ключей RSA и соответствующего сертификата можно использовать следующую команду:
# Generate the RSA keys and certificate openssl req -x509 -nodes -days 365 -newkey rsa:1024 -sha1 -subj \ '/C=US/ST=CA/L=Mountain View/CN=www.example.com' -keyout \ myrsakey.pem -out /tmp/myrsacert.pem
Внимание : Включение параметра -nodes создает закрытый ключ без пароля для защиты. Однако для повышения безопасности рекомендуется опускать этот параметр.
Параметр -sha1 указывает, что ключ будет использоваться для генерации подписей SHA1.
Параметр -subj указывает идентификатор приложения, которое представляет сертификат.
Параметр -keyout указывает файл, в котором будут храниться ключи. Этот файл содержит конфиденциальную информацию и должен быть защищен и не должен передаваться никому.
Параметр -out указывает файл, в котором будет храниться сертификат в формате PEM (который можно отправить в Google при регистрации).
Генерация ключей для .NET-клиента
Платформа .NET не распознает ключи или сертификаты, хранящиеся в формате PEM. Поэтому после создания файла .pem требуется дополнительный шаг:
openssl pkcs12 -export -in test_cert.pem -inkey myrsacert.pem -out myrsacert.pfx -name "Testing Certificate"
На этом этапе генерируется PFX-файл на основе вашего закрытого ключа и сертификата. Этот файл можно импортировать в клиентскую библиотеку .NET для цифровой подписи запросов к API данных Google.
Генерация ключей для Java-клиента
Java-клиент принимает закрытые ключи в формате PKCS#8. После генерации ключа/сертификата, следуя приведенным выше инструкциям , создайте файл .pk8 из сгенерированного файла .pem:
openssl pkcs8 -in myrsakey.pem -topk8 -nocrypt -out myrsakey.pk8
В качестве альтернативы вы можете использовать хранилище ключей Java и утилиту keytool для создания пары ключей RSA и соответствующего сертификата. Используйте следующую команду:
# Generate the RSA keys and certificate keytool -genkey -v -alias Example -keystore ./Example.jks\ -keyalg RSA -sigalg SHA1withRSA\ -dname "CN=www.example.com, OU=Engineering, O=My_Company, L=Mountain View, ST=CA, C=US"\ -storepass changeme -keypass changeme
Внимание : " changeme " — плохой пароль; это всего лишь пример.
Параметр -dname указывает идентификатор приложения, которое представляет сертификат. Параметр -storepass указывает пароль для защиты хранилища ключей. Параметр -keypass указывает пароль для защиты закрытого ключа.
Чтобы записать сертификат в файл, который можно использовать в инструменте ManageDomains , воспользуйтесь следующей командой:
# Output the public certificate to a file keytool -export -rfc -keystore ./Example.jks -storepass changeme \ -alias Example -file mycert.pem