OAuth w bibliotekach klienta protokołu danych Google

Ostrzeżenie: ta strona dotyczy starszych interfejsów API Google – interfejsów API danych Google – dotyczy tylko interfejsów API wymienionych w katalogu interfejsów API danych Google, z których wiele zostało zastąpionych nowszych. Informacje na temat konkretnego nowego interfejsu API można znaleźć w dokumentacji nowego interfejsu API. Informacje o autoryzowaniu żądań za pomocą nowszego interfejsu API znajdziesz w artykule Uwierzytelnianie i autoryzacja kont Google.

Ten dokument opisuje, jak korzystać z bibliotek klienta interfejsu Google Data API do łączenia się z Google OAuth.

Interfejs OAuth umożliwia aplikacji internetowej dostęp do usługi Google w imieniu użytkownika. Aby zapewnić wysoki poziom bezpieczeństwa, OAuth umożliwia aplikacji uzyskiwanie tokena dostępu bez obsługi danych logowania użytkownika.

Biblioteki klienta interfejsu Google Data API udostępniają metody ułatwiające korzystanie z protokołu OAuth w aplikacji internetowej. Konkretnie chodzi tu o sposób budowania pozyskiwania tokena żądania, autoryzowania tokena żądania i wymiany autoryzowanego tokena żądania na token dostępu. Biblioteki obsługują również niezbędne algorytmy podpisywania, gdy wysyłają żądania do usługi danych Google.

Odbiorcy

Ten dokument jest przeznaczony dla programistów, którzy chcą, aby ich aplikacje internetowe miały dostęp do usług Google w imieniu użytkowników za pomocą bibliotek klienta interfejsów API danych Google.

W tym dokumencie założono, że znasz interfejs OAuth i ogólny proces wdrażania protokołu OAuth do aplikacji internetowej. Pełny opis protokołu OAuth znajdziesz w artykule Uwierzytelnianie OAuth do aplikacji internetowych lub w oficjalnej specyfikacji na stronie oauth.net.

korzystanie z trzyetapowej autoryzacji OAuth oraz interfejsów API danych Google bez bibliotek klienta.

Jeśli chcesz, aby Twoja aplikacja internetowa miała dostęp do usługi danych Google przy użyciu protokołu OAuth jako metody autoryzacji, musisz zapoznać się z artykułem Uwierzytelnianie OAuth do aplikacji internetowych. Nie musisz korzystać z bibliotek klienta interfejsów API danych Google, jeśli nie chcesz.

Oto zestawienie metod uwierzytelniania użytkownika przy użyciu protokołu OAuth w aplikacji:

  1. Twoja aplikacja wysyła podpisane żądanie pobrania początkowego tokena żądania OAuth z punktu końcowego OAuthRequestToken.
  2. Aplikacja przekierowuje użytkownika do odpowiedniego adresu URL OAuthAuthorizeToken w celu autoryzacji tokena żądania.
  3. Po przyznaniu dostępu użytkownik jest przekierowany z powrotem do aplikacji (adres URL oauth_callback)
  4. Twoja aplikacja wysyła podpisane żądanie przeniesienia autoryzowanego tokena żądania do tokena dostępu za pomocą punktu końcowego OAuthGetAccessToken.

Biblioteki klienta interfejsów API danych Google upraszczają ten proces przez obsługę różnych szczegółów. W tym dokumencie opisujemy, jak to zrobić.

Rejestrowanie aplikacji internetowej

OAuth wymaga, aby wszystkie wywołania interfejsu API były podpisane cyfrowo. Google obsługuje metody podpisu HMAC-SHA1 i RSA-SHA1. Aby podpisać prośby, musisz najpierw zarejestrować się w Google. Po zakończeniu rejestracji Google dostarczy Ci klucz klienta (i tajny klucz do użytku w domenie HMAC-SHA1) oraz miejsce, w którym możesz przesłać certyfikat publiczny.

1. Rejestracja domeny

Wykonaj czynności opisane w artykule Rejestracja w aplikacjach internetowych.

2. Tworzenie pary klucza prywatnego i certyfikatu publicznego (opcjonalnie)

Jeśli wybierzesz RSA-SHA1 jako oauth_signature_method, musisz utworzyć samodzielnie podpisany klucz prywatny RSA i publiczny certyfikat. Przykład znajdziesz w sekcji Generowanie samodzielnie prywatnego klucza i certyfikatu publicznego (poniżej).

Korzystanie z 3-etapowej autoryzacji OAuth i interfejsów API danych Google: przykłady z biblioteki klienta

Poniżej dowiesz się, jak korzystać z metod biblioteki klienta interfejsu Google Data API w sposób opisany w sekcji „Praca z OAuth” w dokumentacji OAuth. Wszystkie przykłady w tym dokumencie zakładają, że domena hosta aplikacji to example.com.

Określanie zakresu dostępu do danych

Każda usługa Google określa wartość scope, która określa token dostępu do danych użytkownika. Listę dostępnych wartości znajdziesz w artykule Najczęstsze pytania o dane Google. Aby na przykład użyć interfejsu Documents List API, ustaw scope na https://docs.google.com/feeds/, jak opisano w najczęstszych pytaniach.

Uwaga: ustaw wartość scope na najwęższy adres URL, który umożliwia dostęp. Zmniejsza to ryzyko przypadkowego uzyskania i wycieku danych osobowych. Jeśli na przykład chcesz uzyskać dostęp do prywatnego kanału listy dokumentów bieżącego użytkownika, użyj zakresu https://docs.google.com/feeds/default/private/full zamiast szerszego zakresu, takiego jak https://docs.google.com/feeds/, który zapewnia dostęp do wszystkich kanałów list dokumentów.

Tokeny wielozakresowe

Aby utworzyć tokeny mające dostęp do wielu interfejsów Google Data API, oddziel każdy zakres spacją. Przykład poniżej tworzy token zapewniający dostęp do danych w Dokumentach Google i Kalendarzu Google użytkownika.

scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
Kodowanie adresów URL

Znaki inne niż ASCII występujące w adresach URL, w tym dwukropek, ukośnik i spacja, muszą być zakodowane w adresie URL, aby mogły być przesyłane przez HTTP. Biblioteki klienta interfejsu API danych Google automatycznie zapisują parametry za Ciebie w adresie URL, więc możesz po prostu przypisywać ciągi parametrów do parametrów niekodowanych w adresie URL. W kodzie możesz na przykład utworzyć takie przypisanie:

scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/

Gdy wywołasz bibliotekę klienta, parametr scope zostanie automatycznie zakodowany do tej wartości:
https%3a%2f%2fwww.google.com%2fcalendar%2ffeeds%2f+https%3a%2f%2fdocs.google.com%2ffeeds%2f

Pobieram token żądania

Java

W przypadku usługi HMAC-SHA1 potrzebujesz sposobu na zachowanie obiektu tajnego tokena uzyskanego w odpowiedzi, aby utworzyć obiekt tokena OAuth powracający ze strony zatwierdzania. Aby to zrobić, ustaw zmienną sesji lub plik 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);

Przy użyciu RSA-SHA1 oauth_token_secret nie jest używany, więc nie ma potrzeby utrzymywania obiektu tajnego tokena.

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

Użycie HMAC-SHA1 jako metody podpisu:

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

Użycie RSA-SHA1 jako metody podpisu:

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

Użycie HMAC-SHA1 jako metody podpisu:

Jeśli używasz nowszych klas w wersji 2.0 lub nowszej opartych na GDClient, użyj:

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')

Użycie RSA-SHA1 jako metody podpisu:

...

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)

Jeśli używasz starszych klas 1.0 opartych na GDataService, wywołania mogą się nieznacznie różnić:

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)

Użycie RSA-SHA1 jako metody podpisu:

...

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)

.NET

Użycie HMAC-SHA1 jako metody podpisu:

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

Użycie RSA-SHA1 jako metody podpisu:

RSA-SHA1 is not supported yet.

Autoryzowanie tokena żądania

Aby autoryzować token żądania, aplikacja musi przekierować użytkownika do adresu URL OAuthAuthorizeToken, który zachęca do zalogowania się na konto Google. Więcej informacji o adresie URL OAuthAuthorizeToken znajdziesz w artykule o uwierzytelnianiu OAuth w aplikacjach internetowych.

Aby utworzyć adres URL OAuthAuthorizeToken w swojej aplikacji, użyj tej biblioteki dla każdego klienta. Pamiętaj, że te przykłady stanowią uzupełnienie poprzednich przykładów.

Po utworzeniu adresu URL strony zatwierdzania aplikacja może używać go na różne sposoby do wysyłania użytkownika do modułu obsługi OAuthAuthorizeToken. Najczęstszym sposobem jest przekierowanie użytkownika lub wyświetlenie linku do tej strony.

Java

Dla HMAC-SHA1:

String approvalPageUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters);
System.out.println(approvalPageUrl);

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

Możesz też po prostu przekierowywać na adres URL zatwierdzenia:

// If on a G Suite domain, use your domain for the hd param (e.g. 'example.com').
$consumer->redirect(array('hd' => 'default'));

Python

Jeśli używasz nowszych klas w wersji 2.0 lub nowszej opartych na GDClient, użyj:

# 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))

Jeśli używasz starszych klas 1.0 opartych na GDataService, ten proces jest nieco inny.

# 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))

.NET

string authorizationUrl = OAuthUtil.CreateUserAuthorizationUrl(parameters);
Console.WriteLine(authorizationUrl);

Wyodrębnianie tokena z adresu URL wywołania zwrotnego

Gdy Google przekierowuje użytkownika do Twojej aplikacji, parametr oauth_token jest dołączany do adresu URL „oauth_callback_url” jako parametru zapytania. Aplikacja powinna następnie wyodrębnić wartość tokena z parametru zapytania adresu URL i ponownie utworzyć parametry OAuth.

Biblioteki klienta udostępniają wygodne metody wyodrębniania oauth_token. Te przykłady są uzupełnieniem poprzednich.

Java

Jeśli chcesz zachować tajny token tokena w adresie URL wywołania zwrotnego (jeśli używasz 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);

Jedyna różnica w metodzie podpisywania pliku RSA-SHA1 to:

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

Ten krok nie jest wymagany przy korzystaniu z biblioteki PHP.

Python

Jeśli używasz nowszych klas w wersji 2.0 lub nowszej opartych na GDClient, użyj:

# 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)

Jeśli używasz starszych klas 1.0 opartych na GDataService, użyj:

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'

Proces RSA-SHA1 wygląda podobnie, ale bez tajnego tokena:

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'

.NET

Jeśli chcesz zachować tajny token tokena w adresie URL wywołania zwrotnego:

OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);

Uaktualnianie do tokena dostępu

Ostatnim krokiem w tokenie protokołu OAuth jest przekształcenie autoryzowanego tokena żądania w token o długotrwałym dostępie za pomocą adresu URL OAuthGetAccessToken, zgodnie z pełną dokumentacją Uwierzytelnianie OAuth dla aplikacji internetowych.

Oto kilka przykładów użycia poszczególnych bibliotek klienta:

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

Jeśli używasz nowszych klas w wersji 2.0 lub nowszej opartych na GDClient, użyj:

# 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)

Jeśli używasz starszych klas 1.0 opartych na GDataService, użyj:

access_token = client.UpgradeToOAuthAccessToken()  # calls SetOAuthToken() for you

Jeśli używasz gdata.gauth.AeSave() w App Engine, token i tajny token będą przechowywane dla Ciebie jako zalogowany użytkownik.

.NET

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

Uwaga: jeśli korzystasz z HMAC-SHA1, pamiętaj, by zapisać token tokena dostępu obok wartości tokena w bazie danych. W przeciwnym razie nie będziesz w stanie poprawnie zrekonstruować parametrów protokołu OAuth do późniejszego użycia.

Używanie tokena dostępu

Gdy otrzymasz token dostępu, użyj standardowej wywołania biblioteki klienta interfejsów API danych Google, aby wejść w interakcję z usługą. Biblioteka zajmie się podpisywaniem żądań i umieszczaniem odpowiedniego nagłówka autoryzacji. Token użytkownika jest zazwyczaj odczytywany z pliku cookie lub bazy danych. Te przykłady pokazują, jak odtworzyć parametry OAuth i wywoływać bibliotekę biblioteki klienta.

Java

Jeśli używasz 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());
  }
  

Różnica w RSA-SHA1 polega na tym, że nie musisz ustawiać obiektu tajnego tokena dostępu, a tworzenie obiektu podpisującego jest inne:

  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

W tym fragmencie zakładamy, że masz już pobrany token dostępu (przy użyciu identyfikatora HMAC-SHA1) i wycofujesz ten klucz lub tajny token do późniejszego użycia.

Jeśli używasz nowszych klas w wersji 2.0 lub nowszej opartych na GDClient, użyj:

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

Jeśli używasz starszych klas 1.0 opartych na GDataService, użyj:

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

.NET

Jeśli używasz 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);
}

Różnica w RSA-SHA1 polega na tym, że nie musisz ustawiać obiektu tajnego tokena dostępu, a tworzenie obiektu podpisującego jest inne:

RSA-SHA1 is not supported yet.

Dodatkowe trzyetapowe zasoby i przykłady protokołu OAuth

Powrót do góry

Dwuetapowa autoryzacja OAuth

Dwuetapowa autoryzacja OAuth umożliwia zaufanym aplikacjom uzyskiwanie dostępu do danych Google użytkowników bez ich bezpośredniego udziału. Dwie grupy kluczy mogą korzystać z dwuetapowej autoryzacji OAuth:

Administratorzy domen G Suite: administratorzy mogą tworzyć skrypty i aplikacje niestandardowe do zarządzania danymi użytkowników w domenie przy użyciu interfejsów API danych Google. Aby dowiedzieć się więcej o zarządzaniu kluczem i tajnym kluczem, które są powiązane z Twoją domeną G Suite, oraz przyznawaniu globalnej kontroli dostępu, zobacz Zarządzanie kluczem i kluczem tajnym OAuth.

Zewnętrzni dostawcy oprogramowania: w ramach integracji z G Suite dostawcy mogą oferować aplikacje korzystające z dwuetapowej autoryzacji OAuth. Aplikacje innych firm można przyznać na stronie Zarządzanie interfejsem API klienta lub instalując z G Suite Marketplace.

Token dostępu nie jest wymagany zgodnie ze zwykłym procesem autoryzacji (nazywanym też trzyetapową autoryzacją OAuth).

Poniższe przykłady biblioteki klienta pokazują, jak skonfigurować klienta do korzystania z 2-etapowej autoryzacji OAuth za pomocą 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

Jeśli używasz nowszych klas w wersji 2.0 lub nowszej opartych na GDClient, użyj:

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

Jeśli używasz starszych klas 1.0 opartych na GDataService, użyj:

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'

.NET

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

Dodatkowe dwuetapowe zasoby i przykłady protokołu OAuth

Generowanie samodzielnie podpisanego klucza prywatnego i certyfikatu publicznego

Klucz prywatny jest używany do generowania podpisu, który musi być dołączony do każdego żądania. Google używa klucza publicznego umieszczonego w certyfikacie do weryfikowania podpisu. Klucz publiczny musi być 1024-bitowym kluczem RSA zakodowanym w certyfikacie X.509 w formacie PEM. Certyfikat należy przesłać do Google w momencie rejestracji.

Poniższe sekcje zawierają przykłady generowania kluczy i certyfikatów za pomocą 2 konkretnych narzędzi: narzędzia OpenSSL i narzędzia Java keytool.

Te przykłady nie dotyczą konkretnych interfejsów API danych Google. Do generowania kluczy możesz używać tych samych narzędzi.

Przykład

Generowanie kluczy przy użyciu OpenSSL

Aby utworzyć parę kluczy RSA i odpowiadający im certyfikat, możesz użyć tego polecenia:

# 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

Ostrzeżenie: dodanie parametru -nodes spowoduje utworzenie klucza prywatnego bez hasła. Warto jednak pominąć ten parametr, aby zwiększyć bezpieczeństwo.

Parametr -sha1 określa, że klucz będzie używany do generowania podpisów SHA1.

Parametr -subj określa tożsamość aplikacji, którą reprezentuje certyfikat.

Parametr -keyout określa plik, który zawiera klucze. Ten plik zawiera informacje poufne, więc powinien być chroniony i nie należy go nikomu udostępniać.

Parametr -out określa plik zawierający certyfikat w formacie PEM (który można wysłać do Google podczas rejestracji).

Generowanie kluczy dla klienta .NET

Platforma .NET nie rozpoznaje kluczy ani certyfikatów przechowywanych w formacie PEM. W związku z tym po utworzeniu pliku .pem musisz wykonać dodatkowy krok:

openssl pkcs12 -export -in test_cert.pem -inkey myrsacert.pem -out myrsacert.pfx -name "Testing Certificate"

W tym kroku zostanie wygenerowany plik PFX z klucza prywatnego i certyfikatu. Ten plik można zaimportować do biblioteki klienta .NET, aby podpisywać cyfrowe żądania wysyłane do interfejsów API danych Google.

Generowanie kluczy dla klienta Java

Klient języka Java akceptuje klucze prywatne w formacie PKCS#8. Po wygenerowaniu klucza lub certyfikatu zgodnie z powyższymi instrukcjami utwórz plik .pk8 z wygenerowanego pliku .pem:

openssl pkcs8 -in myrsakey.pem -topk8 -nocrypt -out myrsakey.pk8

Możesz też użyć magazynu kluczy Java i narzędzia keykey do utworzenia pary kluczy RSA i odpowiedniego certyfikatu. Użyj tego polecenia:

# 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

Ostrzeżenie:changeme” nie jest dobrym hasłem. To tylko przykład.

Parametr -dname określa tożsamość aplikacji, którą reprezentuje certyfikat. Parametr -storepass określa hasło, które ma chronić magazyn kluczy. Parametr -keypass określa hasło, które ma chronić klucz prywatny.

Aby zapisać certyfikat w pliku, którego można użyć w narzędziu ManageDomains, użyj tego polecenia:

# Output the public certificate to a file
keytool -export -rfc -keystore ./Example.jks -storepass changeme \
  -alias Example -file mycert.pem

Powrót do góry