Ostrzeżenie: ta strona dotyczy starszych interfejsów API Google, czyli interfejsów Google Data API. Jest ona istotna tylko w przypadku interfejsów API wymienionych w katalogu interfejsów Google Data API, z których wiele zostało zastąpionych nowszymi interfejsami API. Informacje o konkretnym nowym interfejsie API znajdziesz w jego dokumentacji. Informacje o autoryzowaniu żądań za pomocą nowszego interfejsu API znajdziesz w artykule Uwierzytelnianie i autoryzacja kont Google.
W tym dokumencie opisujemy, jak za pomocą bibliotek klienta Google Data API łączyć się z uwierzytelnianiem OAuth w aplikacjach internetowych Google.
Interfejs OAuth umożliwia aplikacji internetowej dostęp do usługi Google w imieniu użytkownika. Aby zachować wysoki poziom bezpieczeństwa, protokół OAuth umożliwia aplikacji uzyskanie tokena dostępu bez konieczności obsługi informacji logowania użytkownika.
Biblioteki klienta interfejsu Google Data API udostępniają metody, które pomagają korzystać z OAuth w aplikacji internetowej. W szczególności istnieją metody tworzenia i uzyskiwania tokena żądania, autoryzowania tokena żądania oraz wymiany autoryzowanego tokena żądania na token dostępu. Biblioteki obsługują też niezbędne algorytmy podpisywania podczas wysyłania żądań do usługi danych Google.
Odbiorcy
Ten dokument jest przeznaczony dla programistów, którzy chcą, aby ich aplikacje internetowe uzyskiwały dostęp do usług Google w imieniu użytkowników za pomocą bibliotek klienta interfejsów Google Data API.
W tym dokumencie zakłada się, że znasz interfejs OAuth i ogólny proces wdrażania OAuth w aplikacji internetowej. Pełny opis protokołu OAuth znajdziesz w artykule Uwierzytelnianie OAuth w aplikacjach internetowych lub w oficjalnej specyfikacji na stronie oauth.net.
Korzystanie z 3-etapowego OAuth i interfejsów Google Data API bez bibliotek klienta
Jeśli chcesz, aby Twoja aplikacja internetowa wchodziła w interakcje z usługą danych Google przy użyciu protokołu OAuth jako metody autoryzacji, wszystkie potrzebne informacje znajdziesz w artykule Uwierzytelnianie OAuth w aplikacjach internetowych. Jeśli nie chcesz, nie musisz używać bibliotek klienta interfejsów Google Data API.
Oto schemat uwierzytelniania użytkownika w aplikacji za pomocą protokołu OAuth:
- Aplikacja wysyła podpisane żądanie pobrania początkowego tokena żądania OAuth z punktu końcowego
OAuthRequestToken. - Aplikacja przekierowuje użytkownika na odpowiedni adres URL
OAuthAuthorizeToken, aby autoryzować token żądania. - Po przyznaniu dostępu użytkownik zostanie przekierowany z powrotem do Twojej aplikacji (adres URL
oauth_callback). - Aplikacja wysyła podpisane żądanie uaktualnienia autoryzowanego tokena żądania do tokena dostępu za pomocą punktu końcowego
OAuthGetAccessToken.
Biblioteki klienta interfejsów API danych Google upraszczają ten proces autoryzacji, ponieważ obsługują różne szczegóły. Z tego dokumentu dowiesz się, 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 podpisywać żądania, aplikacja musi najpierw zarejestrować się w Google. Po rejestracji Google udostępni Ci klucz klienta (i klucz tajny do użycia z HMAC-SHA1) oraz miejsce, w którym możesz przesłać certyfikat publiczny.
1. Rejestracja domeny
Wykonaj czynności opisane w artykule Rejestracja aplikacji internetowych.
2. Tworzenie pary klucza prywatnego i certyfikatu publicznego (opcjonalnie)
Jeśli jako oauth_signature_method wybierzesz RSA-SHA1, musisz utworzyć parę RSAklucza prywatnego i certyfikatu publicznego podpisaną samodzielnie. Przykłady znajdziesz w sekcji Generowanie podpisanego samodzielnie klucza prywatnego i certyfikatu publicznego (poniżej).
Praca z 3-etapowym uwierzytelnianiem OAuth i interfejsami Google Data API: przykłady bibliotek klienta
W kolejnych sekcjach znajdziesz przykłady użycia metod biblioteki klienta interfejsów Google Data API, które pozwolą Ci wykonać czynności opisane w sekcji „Korzystanie 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 decyduje o dostępie tokena do danych użytkownika. Dostępne wartości zakresu znajdziesz w odpowiedziach na najczęstsze pytania dotyczące danych Google. Na przykład aby użyć interfejsu Documents List API, ustaw wartość parametru scope na https://docs.google.com/feeds/, jak podano w tym artykule.
Uwaga: ustaw wartość scope na najwęższy adres URL, który umożliwia potrzebny dostęp. Zmniejsza to ryzyko przypadkowego uzyskania i ujawnienia danych osobowych. Jeśli na przykład chcesz uzyskać dostęp do prywatnego pliku danych 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 plików danych Listy dokumentów.
Tokeny o wielu zakresach
Aby utworzyć tokeny, które uzyskują dostęp do wielu interfejsów Google Data API, rozdziel każdy zakres spacją. Poniższy przykład tworzy token z dostępem do danych Dokumentów Google i Kalendarza Google użytkownika.
scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
Kodowanie URL
Znaki spoza ASCII, które występują w adresach URL, w tym dwukropek, ukośnik i spacja, muszą być zakodowane w formacie URL, aby można je było przesyłać przez HTTP. Biblioteki klienta Google Data API automatycznie kodują parametry w adresie URL, więc podczas przypisywania wartości do parametrów możesz po prostu używać ciągów znaków bez kodowania w adresie URL. W kodzie możesz na przykład przypisać:
scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
Gdy wywołasz bibliotekę klienta, parametr
scope zostanie automatycznie zakodowany na potrzeby adresu URL do następującej wartości:
https%3a%2f%2fwww.google.com%2fcalendar%2ffeeds%2f+https%3a%2f%2fdocs.google.com%2ffeeds%2f
Pobieranie tokena żądania
Java
W przypadku HMAC-SHA1 musisz mieć możliwość zapisania tajnego klucza tokena (uzyskanego w odpowiedzi), aby utworzyć obiekt tokena OAuth zwracany 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);
W przypadku RSA-SHA1 oauth_token_secret nie jest używany, więc nie trzeba przechowywać klucza 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
Metoda podpisu 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)))); }
Metoda podpisu 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
Metoda podpisu HMAC-SHA1:
Jeśli używasz nowszych klas w wersji 2.0 lub nowszej opartych na klasie 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')
Metoda podpisu 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)
Jeśli używasz starszych klas w wersji 1.0 opartych na GDataService, wywołania są nieco inne:
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)
Metoda podpisu 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)
.NET
Metoda podpisu 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);
Metoda podpisu RSA-SHA1:
RSA-SHA1 is not supported yet.
Autoryzowanie tokena żądania
Aby autoryzować token żądania, aplikacja musi przekierować użytkownika na adres URL OAuthAuthorizeToken, który wyświetli prośbę o zalogowanie się na konto Google.
Więcej informacji o adresie URL OAuthAuthorizeToken znajdziesz w pełnej wersji artykułu Uwierzytelnianie OAuth w aplikacjach internetowych.
Aby utworzyć adres URL OAuthAuthorizeToken w aplikacji, użyj w przypadku każdej biblioteki klienta tych informacji: Pamiętaj, że te przykłady bazują na poprzednich.
Po utworzeniu adresu URL strony zatwierdzania aplikacja może go używać na różne sposoby, aby przekierowywać użytkownika do modułu obsługi OAuthAuthorizeToken. Najczęstszym rozwiązaniem jest przekierowanie użytkownika lub wyświetlenie linku do tej strony.
Java
W przypadku HMAC-SHA1:
String approvalPageUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters); System.out.println(approvalPageUrl);
W przypadku 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 przekierować użytkownika 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 klasie 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 w wersji 1.0 opartych na GDataService, 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 przekieruje użytkownika z powrotem do Twojej aplikacji, parametr oauth_token zostanie dołączony do adresu URL „oauth_callback_url” jako parametr zapytania.
Aplikacja powinna następnie wyodrębnić wartość tokena z parametru zapytania w adresie URL i ponownie ustanowić parametry oauth.
Biblioteki klienta udostępniają wygodne metody wyodrębniania oauth_token. Te przykłady są oparte na poprzednich.
Java
Jeśli zdecydujesz się zachować tajny klucz tokena w adresie URL wywołania zwrotnego (w przypadku używania 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 przypadku RSA-SHA1 to metoda podpisywania:
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 konieczny, jeśli używasz biblioteki PHP.
Python
Jeśli używasz nowszych klas w wersji 2.0 lub nowszej opartych na klasie 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 w wersji 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 jest podobny w przypadku RSA-SHA1, 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 zdecydujesz się zachować klucz tajny tokena w adresie URL wywołania zwrotnego:
OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);
Przejście na token dostępu
Ostatnim krokiem w procesie uzyskiwania tokena OAuth jest przekształcenie autoryzowanego tokena żądania w długoterminowy token dostępu za pomocą adresu URL OAuthGetAccessToken, jak opisano w pełnej dokumentacji uwierzytelniania OAuth w aplikacjach 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 klasie 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 w wersji 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 klucz tokena będą przechowywane w przypadku aktualnie zalogowanego użytkownika.
.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 używasz HMAC-SHA1, pamiętaj, aby zapisać w bazie danych tajny klucz tokena dostępu wraz z wartością tokena. W przeciwnym razie nie będzie można prawidłowo odtworzyć parametrów OAuth do późniejszego użycia.
Używanie tokena dostępu
Po uzyskaniu tokena dostępu użyj standardowych wywołań biblioteki klienta interfejsów API danych Google, aby korzystać z usługi. Biblioteka zajmie się podpisywaniem żądań i uwzględnianiem prawidłowego nagłówka autoryzacji. Zwykle token użytkownika jest pobierany z pliku cookie lub bazy danych. Te przykłady pokazują, jak odtworzyć parametry OAuth i wykonać wywołanie biblioteki klienta.
Java
Jeśli korzystasz z 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 przypadku RSA-SHA1 polega na tym, że nie musisz ustawiać klucza tajnego tokena dostępu, a konstrukcja obiektu sygnującego jest inna:
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
Ten fragment kodu zakłada, że masz już pobrany token dostępu (za pomocą HMAC-SHA1) i przywołujesz klucz/tajny kod tokena do późniejszego użycia.
Jeśli używasz nowszych klas w wersji 2.0 lub nowszej opartych na klasie 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 w wersji 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 korzystasz z 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 przypadku RSA-SHA1 polega na tym, że nie musisz ustawiać klucza tajnego tokena dostępu, a konstrukcja obiektu sygnującego jest inna:
RSA-SHA1 is not supported yet.
Dodatkowe zasoby i przykłady dotyczące trzyetapowej autoryzacji OAuth
- Przykłady OAuth na blogu Google Data API Tips
- Artykuł: Używanie OAuth z interfejsami Google Data API
- Przykładowa biblioteka klienta Python
- Biblioteka klienta Python przykład Google App Engine
- Przykładowa biblioteka klienta Java
- Biblioteka klienta Java przykładowa aplikacja Google App Engine
- Przykładowa biblioteka klienta Zend PHP
- Dokumentacja Uwierzytelnianie OAuth w przypadku aplikacji internetowych
- Dokumentacja OAuth.net
2-etapowa autoryzacja OAuth
2-etapowa autoryzacja OAuth umożliwia zaufanym aplikacjom dostęp do danych Google użytkowników bez ich bezpośredniego udziału. Z dwuetapowej autoryzacji OAuth mogą korzystać 2 główne grupy:
Administratorzy domeny G Suite: administratorzy mogą tworzyć skrypty i aplikacje niestandardowe, które zarządzają danymi użytkowników w ich domenie za pomocą interfejsów Google Data API. Więcej informacji o zarządzaniu kluczem i kluczem tajnym powiązanym z domeną G Suite oraz o przyznawaniu globalnej kontroli dostępu znajdziesz w artykule „Zarządzanie kluczem i kluczem tajnym OAuth”.
Dostawcy oprogramowania innych firm: dostawcy mogą oferować aplikacje, które korzystają z protokołu OAuth z 2 etapami weryfikacji, aby zintegrować się z G Suite. Dostęp do aplikacji innych firm można przyznać na stronie Zarządzaj klientem interfejsu API lub instalując aplikację z G Suite Marketplace.
Token dostępu nie jest wymagany zgodnie ze standardowym procesem autoryzacji (zwanym też trzyetapową autoryzacją OAuth).
Poniższe przykłady bibliotek klienta pokazują, jak skonfigurować klienta do korzystania z OAuth w przypadku 2 użytkowników 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 klasie 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 w wersji 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 materiały i przykłady dotyczące dwuetapowej autoryzacji OAuth
- Przykłady dwuetapowej autoryzacji OAuth na blogu Google Data API Tips
- Biblioteka klienta Java 2-Legged OAuth sample
- Biblioteka klienta Python TwoLeggedOAuthExample (w przypadku klas client.py) lub przykładowy kod 2_legged_oauth (w przypadku klas service.py)
- Biblioteka klienta .NET 2-Legged OAuth sample
- Dokumentacja dwuetapowej autoryzacji OAuth
Generowanie klucza prywatnego i certyfikatu publicznego do samodzielnego podpisywania
Klucz prywatny służy do generowania podpisu, który musi być dołączony do każdego żądania. Klucz publiczny osadzony w certyfikacie jest używany przez Google do weryfikacji 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.
W sekcjach poniżej znajdziesz przykłady generowania kluczy i certyfikatów za pomocą 2 narzędzi: narzędzia OpenSSL i narzędzia keytool w Javie.
Te przykłady nie są specyficzne dla interfejsów Google Data API. Możesz używać tych samych narzędzi do generowania kluczy w dowolnym celu.
W przykładach założono, że Twoja firma nazywa się My_Company i ma siedzibę w Mountain View w Kalifornii w Stanach Zjednoczonych, a jej nazwa domeny to example.com.
Generowanie kluczy za pomocą OpenSSL
Aby utworzyć parę kluczy RSA i odpowiadający jej 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: uwzględnienie parametru -nodes powoduje utworzenie klucza prywatnego bez hasła, które by go chroniło.
Jednak ze względów bezpieczeństwa warto pominąć ten parametr.
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 będzie zawierać klucze.
Ten plik zawiera informacje poufne, dlatego należy go chronić i nie udostępniać nikomu.
Parametr -out określa plik, który będzie zawierać certyfikat w formacie PEM (można go przesłać do Google podczas rejestracji).
Generowanie kluczy dla klienta .NET
Platforma .NET nie rozpoznaje kluczy ani certyfikatów zapisanych w formacie PEM. Dlatego po utworzeniu pliku .pem musisz wykonać dodatkowy krok:
openssl pkcs12 -export -in test_cert.pem -inkey myrsacert.pem -out myrsacert.pfx -name "Testing Certificate"
Ten krok generuje plik PFX z klucza prywatnego i certyfikatu. Ten plik można zaimportować do biblioteki klienta .NET, aby cyfrowo podpisywać żądania wysyłane do interfejsów Google Data API.
Generowanie kluczy dla klienta Java
Klient 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 keytool, aby utworzyć parę kluczy RSA i odpowiedni certyfikat. 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” to słabe hasło. To tylko przykład.
Parametr -dname określa tożsamość aplikacji, którą reprezentuje certyfikat. Parametr -storepass określa hasło do ochrony magazynu kluczy. Parametr -keypass określa hasło do ochrony klucza prywatnego.
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