OAuth в клиентских библиотеках протокола данных Google

Предупреждение . Эта страница посвящена старым API Google, API данных Google; это относится только к API, которые перечислены в каталоге API данных Google , многие из которых были заменены более новыми API. Для получения информации о конкретном новом API см. документацию по новому API. Информацию об авторизации запросов с помощью более нового API см. в разделе Аутентификация и авторизация учетных записей Google .

В этом документе описывается, как использовать клиентские библиотеки Google Data API для подключения к Google OAuth Authentication for Web Applications .

Интерфейс OAuth позволяет веб-приложению получать доступ к службе Google от имени пользователя. Для поддержания высокого уровня безопасности OAuth позволяет приложению получать токен доступа, даже не обрабатывая информацию для входа в учетную запись пользователя.

Клиентские библиотеки Google Data API предоставляют методы, помогающие использовать OAuth в веб-приложении. В частности, существуют методы для создания получения маркера запроса, авторизации маркера запроса и обмена авторизованного маркера запроса на маркер доступа. Библиотеки также обрабатывают необходимые алгоритмы подписи при выполнении запросов к службе данных Google.

Аудитория

Этот документ предназначен для программистов, которые хотят, чтобы их веб-приложения имели доступ к службам Google от имени пользователей, используя клиентские библиотеки Google Data API.

В этом документе предполагается, что вы знакомы с интерфейсом OAuth и общим процессом включения OAuth в ваше веб-приложение. Полное описание протокола OAuth см. в разделе Аутентификация OAuth для веб-приложений или в официальной спецификации на сайте oauth.net .

Использование трехэтапных OAuth и API данных Google без клиентских библиотек

Если вы хотите, чтобы ваше веб-приложение взаимодействовало со службой данных Google, используя OAuth в качестве метода авторизации, то все, что вам нужно знать, находится в OAuth Authentication for Web Applications . Нет необходимости использовать клиентские библиотеки API данных Google, если вы этого не хотите.

Вот схема того, как ваше приложение может аутентифицировать пользователя с помощью OAuth:

  1. Ваше приложение отправляет подписанный запрос на получение токена начального запроса OAuth из конечной точки OAuthRequestToken .
  2. Ваше приложение перенаправляет пользователя на соответствующий URL-адрес OAuthAuthorizeToken для авторизации токена запроса.
  3. После предоставления доступа пользователь перенаправляется обратно в ваше приложение (URL-адрес oauth_callback )
  4. Ваше приложение отправляет подписанный запрос на обновление маркера авторизованного запроса до маркера доступа с помощью конечной точки OAuthGetAccessToken .

Клиентские библиотеки API данных Google упрощают этот процесс авторизации, обрабатывая для вас различные детали. В этом документе объясняется, как.

Регистрация вашего веб-приложения

OAuth требует, чтобы все вызовы API были подписаны цифровой подписью. Google поддерживает методы подписи HMAC-SHA1 и RSA-SHA1 . Чтобы подписывать запросы, ваше приложение сначала должно зарегистрироваться в Google . После регистрации Google предоставит вам потребительский ключ (и секрет для использования с HMAC-SHA1 ) и место для загрузки общедоступного сертификата.

1. Регистрация вашего домена

Пожалуйста, следуйте шагам, описанным в разделе «Регистрация веб-приложений» .

2. Создание пары закрытый ключ/открытый сертификат (необязательно)

Если вы решите использовать RSA-SHA1 в качестве oauth_signature_method , вам потребуется создать пару самозаверяющего закрытого ключа RSA и открытого сертификата. См. раздел Создание самоподписывающего закрытого ключа и открытого сертификата (ниже) для примеров того, как это сделать.

Работа с трехсторонним протоколом OAuth и API данных Google: примеры клиентских библиотек

В следующих разделах показаны примеры использования методов клиентской библиотеки API данных Google для выполнения действий, описанных в разделе " Работа с OAuth " документации по OAuth. Во всех примерах в этом документе предполагается, что домен вашего приложения — example.com .

Определение области вашего доступа к данным

Каждая служба Google определяет значение scope , которое определяет доступ токена к данным пользователя. Доступные значения области перечислены в часто задаваемых вопросах по данным Google . Например, чтобы использовать API списка документов, установите scope https://docs.google.com/feeds/ , как указано в разделе часто задаваемых вопросов .

Примечание . Установите значение scope на самый узкий URL-адрес, который разрешает доступ, который вам нужен. Это снижает вероятность случайного получения и утечки личных данных. Например, если вы хотите получить доступ к личной ленте списка документов текущего пользователя, используйте область https://docs.google.com/feeds/default/private/full вместо более широкой области, такой как 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. Клиентские библиотеки API данных Google автоматически кодируют для вас параметры 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

Получение токена запроса

Джава

Для 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)));
}

Питон

Использование HMAC-SHA1 в качестве метода подписи:

Если вы используете более новые классы v2.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 Authentication for Web Applications .

Чтобы создать URL-адрес OAuthAuthorizeToken в своем приложении, используйте следующий код для каждой клиентской библиотеки. Обратите внимание, что эти примеры основаны на предыдущих примерах.

После создания URL-адреса страницы утверждения ваше приложение может использовать его различными способами для отправки пользователя обработчику OAuthAuthorizeToken . Самый распространенный подход — перенаправить пользователя или отобразить ссылку на эту страницу.

Джава

Для 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'));

Питон

Если вы используете более новые классы v2.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 . Эти примеры основаны на предыдущих примерах.

Джава

Если вы решили сохранить секрет токена в 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.

Питон

Если вы используете более новые классы v2.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 для веб-приложений .

Вот несколько примеров использования каждой из клиентских библиотек:

Джава

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'])));
  }
}

Питон

Если вы используете более новые классы v2.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 для последующего использования.

Использование токена доступа

После получения токена доступа используйте стандартные вызовы клиентской библиотеки API данных Google для взаимодействия со службой. Библиотека позаботится о том, чтобы подписать запросы и включить правильный заголовок авторизации. Как правило, вы будете вызывать токен пользователя из файла cookie или базы данных. В этих примерах показано, как восстановить параметры oauth и выполнить вызов клиентской библиотеки.

Джава

Если вы используете 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";
}

Питон

В этом фрагменте предполагается, что вы уже получили токен доступа (используя HMAC-SHA1 ) и отзываете этот ключ/секрет токена для последующего использования.

Если вы используете более новые классы v2.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

Вернуться к вершине

2-сторонний OAuth

Двухсторонний протокол OAuth позволяет доверенным приложениям получать доступ к данным Google пользователей без их непосредственного участия. Две ключевые группы могут использовать двухсторонний протокол OAuth:

Администраторы домена G Suite: администраторы могут создавать сценарии и пользовательские приложения, которые управляют данными пользователей для своего домена с помощью API данных Google. Чтобы узнать об управлении ключом и секретом, связанным с вашим доменом G Suite, а также о предоставлении глобального контроля доступа, см. раздел «Управление ключом и секретом OAuth» .

Сторонние поставщики программного обеспечения. Поставщики могут предлагать приложения, использующие двусторонний протокол OAuth для интеграции с G Suite. Доступ к сторонним приложениям можно предоставить на странице управления клиентом API или путем установки из G Suite Marketplace.

Маркер доступа не требуется в соответствии с обычным потоком авторизации (также называемым трехсторонним OAuth).

В следующих примерах клиентской библиотеки показано, как настроить клиент для использования двухстороннего протокола OAuth с помощью HMAC-SHA1 .

Джава

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";
}

Питон

Если вы используете более новые классы v2.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

Создание самоподписывающего закрытого ключа и открытого сертификата

Закрытый ключ используется для создания подписи, которую необходимо включать в каждый запрос. Открытый ключ, встроенный в сертификат, используется 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

Вернуться к вершине