Uyarı: Bu sayfa, Google'ın eski API'leri olan Google Veri API'leri hakkındadır. Yalnızca Google Veri API'leri dizininde listelenen API'ler için geçerlidir. Bu API'lerin çoğu daha yeni API'lerle değiştirilmiştir. Belirli bir yeni API hakkında bilgi edinmek için yeni API'nin belgelerine bakın. Daha yeni bir API ile istekleri yetkilendirme hakkında bilgi edinmek için Google Hesapları Kimlik Doğrulama ve Yetkilendirme başlıklı makaleyi inceleyin.
Bu belgede, Google'ın Web Uygulamaları İçin OAuth Kimlik Doğrulaması'na bağlanmak üzere Google Veri API'si istemci kitaplıklarının nasıl kullanılacağı açıklanmaktadır.
OAuth arayüzü, web tabanlı bir uygulamanın kullanıcı adına bir Google hizmetine erişmesine olanak tanır. OAuth, yüksek düzeyde güvenlik sağlamak için uygulamanın kullanıcının hesap giriş bilgilerini hiçbir zaman işlememesine rağmen erişim jetonu almasına olanak tanır.
Google Veri API'si istemci kitaplıkları, web uygulamanızda OAuth'u kullanmanıza yardımcı olacak yöntemler sunar. Daha spesifik olarak, istek jetonu oluşturma, istek jetonunu yetkilendirme ve yetkilendirilmiş istek jetonunu erişim jetonuyla değiştirme yöntemleri vardır. Kitaplıklar, bir Google Veri Hizmeti'ne istekte bulunurken gerekli imzalama algoritmalarını da işler.
Kitle
Bu belge, web tabanlı uygulamalarının Google Data API'leri istemci kitaplıklarını kullanarak kullanıcılar adına Google hizmetlerine erişmesini isteyen programcılar için hazırlanmıştır.
Bu belgede, OAuth arayüzü ve OAuth'u web uygulamanıza dahil etme genel süreci hakkında bilgi sahibi olduğunuz varsayılmaktadır. OAuth protokolünün tam açıklaması için Web Uygulamaları için OAuth Kimlik Doğrulaması başlıklı makaleye veya oauth.net adresindeki resmi spesifikasyona bakın.
İstemci kitaplıkları olmadan 3 bacaklı OAuth ve Google Veri API'lerini kullanma
Web uygulamanızın, yetkilendirme yöntemi olarak OAuth'u kullanarak bir Google Veri Hizmeti ile etkileşimde bulunmasını istiyorsanız, bilmeniz gereken her şeyi Web Uygulamaları İçin OAuth Kimlik Doğrulaması bölümünde bulabilirsiniz. İstemiyorsanız Google Veri API'leri istemci kitaplıklarını kullanmanız gerekmez.
Uygulamanızın OAuth kullanarak kullanıcı kimliğini nasıl doğrulayabileceğine dair bir taslak aşağıda verilmiştir:
- Uygulamanız,
OAuthRequestTokenuç noktasından ilk OAuth istek jetonunu getirmek için imzalı bir istekte bulunur. - Uygulamanız, istek jetonunu yetkilendirmek için kullanıcıyı uygun
OAuthAuthorizeTokenURL'sine yönlendirir. - Erişim izni verildikten sonra kullanıcı uygulamanıza (
oauth_callbackURL'si) geri yönlendirilir. - Uygulamanız,
OAuthGetAccessTokenuç noktasını kullanarak yetkili istek jetonunu erişim jetonuna yükseltmek için imzalı bir istek gönderir.
Google Data API'leri istemci kitaplıkları, çeşitli ayrıntıları sizin yerinize işleyerek bu yetkilendirme sürecini basitleştirir. Bu belgede nasıl yapılacağı açıklanmaktadır.
Web uygulamanızı kaydetme
OAuth, tüm API çağrılarının dijital olarak imzalanmasını gerektirir. Google, HMAC-SHA1 ve RSA-SHA1 imza yöntemlerini destekler. İstekleri imzalamak için uygulamanızın önce Google'a kaydolması gerekir. Kaydolduktan sonra Google size bir tüketici anahtarı (ve HMAC-SHA1 ile kullanılacak gizli anahtar) ve ortak sertifika yükleyebileceğiniz bir yer sağlar.
1. Alanınızı kaydetme
Lütfen Registration for Web-Based Applications (Web Tabanlı Uygulamalara Kayıt) başlıklı makalede belirtilen adımları uygulayın.
2. Özel anahtar / ortak sertifika çifti oluşturma (isteğe bağlı)
RSA-SHA1 öğesini oauth_signature_method olarak kullanmayı seçerseniz kendinden imzalı bir RSA özel anahtar ve ortak sertifika çifti oluşturmanız gerekir. Bunun nasıl yapılacağıyla ilgili örnekler için Kendinden imzalı özel anahtar ve genel sertifika oluşturma (aşağıda) bölümüne bakın.
3 bacaklı OAuth ve Google Veri API'leri ile çalışma: istemci kitaplığı örnekleri
Aşağıdaki bölümlerde, OAuth belgelerinin "OAuth ile Çalışma" bölümünde özetlenen adımları uygulamak için Google Veri API'leri istemci kitaplığı yöntemlerinin kullanımına ilişkin örnekler gösterilmektedir. Bu belgedeki tüm örneklerde, uygulama barındırıcı alanınızın example.com olduğu varsayılır.
Veri erişiminizin kapsamını belirleme
Her Google hizmeti, jetonun kullanıcı verilerine erişimini belirleyen bir scope değeri tanımlar. Kullanılabilir kapsam değerleri Google Verileri Hakkında SSS bölümünde listelenmiştir. Örneğin, Doküman Listesi API'sini kullanmak için SSS'de belirtildiği gibi scope değerini https://docs.google.com/feeds/ olarak ayarlayın.
Not: scope değerini, ihtiyacınız olan erişime izin veren en dar URL'ye ayarlayın. Bu, kişisel verilerin yanlışlıkla elde edilmesi ve sızdırılması ihtimalini azaltır. Örneğin, mevcut kullanıcının özel Doküman Listesi feed'ine erişmek istiyorsanız tüm Doküman Listesi feed'lerine erişim sağlayan https://docs.google.com/feeds/ gibi daha geniş bir kapsam yerine https://docs.google.com/feeds/default/private/full kapsamını kullanın.
Çok kapsamlı jetonlar
Birden fazla Google Veri API'sine erişen jetonlar oluşturmak için her kapsamı bir boşluk karakteriyle ayırın. Aşağıdaki örnekte, kullanıcının Google Dokümanlar ve Google Takvim verilerine erişimi olan bir jeton oluşturulur.
scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
URL kodlama
İki nokta üst üste, eğik çizgi ve boşluk gibi URL'lerde görünen ASCII olmayan karakterlerin HTTP üzerinden iletilebilmesi için URL kodlamalı olması gerekir. Google Data API istemci kitaplıkları, parametreleri sizin için otomatik olarak URL kodlu hale getirir. Bu nedenle, parametrelere değer atarken URL kodlu olmayan dizeleri kullanabilirsiniz. Örneğin, kodunuzda aşağıdaki atamayı yapabilirsiniz:
scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
İstemci kitaplığını çağırdığınızda
scope parametresi otomatik olarak URL kodlaması yapılarak şu değere dönüştürülür:
https%3a%2f%2fwww.google.com%2fcalendar%2ffeeds%2f+https%3a%2f%2fdocs.google.com%2ffeeds%2f
İstek jetonu getirme
Java
HMAC-SHA1 için, onay sayfasından geri gelen bir OAuth jeton nesnesi oluşturmak üzere jeton gizli anahtarını (yanıtta elde edilen) kalıcı hale getirmenin bir yolunu bulmanız gerekir. Bunun için bir oturum değişkeni veya çerez ayarlayın.
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 kullanıldığında oauth_token_secret kullanılmaz. Bu nedenle, jeton gizli anahtarının kalıcı hale getirilmesine gerek yoktur.
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
İmza yöntemi olarak HMAC-SHA1 kullanma:
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)))); }
İmza yöntemi olarak RSA-SHA1 kullanma:
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
İmza yöntemi olarak HMAC-SHA1 kullanma:
GDClient'a dayalı daha yeni v2.0+ sınıflarını kullanıyorsanız:
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')
İmza yöntemi olarak RSA-SHA1 kullanma:
... 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)
Alternatif olarak, GDataService'e dayalı eski v1.0 sınıflarını kullanıyorsanız çağrılar biraz farklıdır:
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)
İmza yöntemi olarak RSA-SHA1 kullanma:
... 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
İmza yöntemi olarak HMAC-SHA1 kullanma:
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);
İmza yöntemi olarak RSA-SHA1 kullanma:
RSA-SHA1 is not supported yet.
İstek jetonunu yetkilendirme
İstek jetonunu yetkilendirmek için uygulamanız, kullanıcıyı OAuthAuthorizeToken URL'sine yönlendirmeli ve Google Hesaplarına giriş yapmaya davet etmelidir.
OAuthAuthorizeToken URL'si hakkında daha fazla bilgi için Web Uygulamaları için OAuth Kimlik Doğrulaması başlıklı makalenin tamamını inceleyin.
Uygulamanızda OAuthAuthorizeToken URL'sini oluşturmak için her istemci kitaplığı için aşağıdakileri kullanın. Bu örneklerin, önceki örnekler temel alınarak oluşturulduğunu unutmayın.
Onay sayfası URL'sini oluşturduktan sonra uygulamanız, kullanıcıyı OAuthAuthorizeToken işleyicisine göndermek için bu URL'yi çeşitli şekillerde kullanabilir. En yaygın yaklaşım, kullanıcıyı yönlendirmek veya söz konusu sayfaya bir bağlantı göstermektir.
Java
HMAC-SHA1 için:
String approvalPageUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters); System.out.println(approvalPageUrl);
RSA-SHA1 için:
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>";
Alternatif olarak, onay URL'sine yönlendirme yapabilirsiniz:
// If on a G Suite domain, use your domain for the hd param (e.g. 'example.com'). $consumer->redirect(array('hd' => 'default'));
Python
GDClient'a dayalı daha yeni v2.0+ sınıflarını kullanıyorsanız:
# 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))
GDataService'e dayalı eski v1.0 sınıflarını kullanıyorsanız süreç biraz farklıdır.
# 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);
Geri çağırma URL'sinden jetonu çıkarma
Google, uygulamanıza geri yönlendirme yaptığında oauth_token, "oauth_callback_url" URL'sine sorgu parametresi olarak eklenir.
Uygulamanız daha sonra URL sorgu parametresinden jeton değerini ayıklamalı ve oauth parametrelerini yeniden oluşturmalıdır.
İstemci kitaplıkları, oauth_token değerini ayıklamak için kolaylık sağlayan yöntemler sunar. Bu örnekler, önceki örnekler üzerine kurulmuştur.
Java
HMAC-SHA1 işlevini kullanırken geri çağırma URL'sinde jeton gizli anahtarını kalıcı hale getirmeyi seçtiyseniz:
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 ile tek fark imzalama yöntemidir:
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 kitaplığı kullanılırken bu adım gerekli değildir.
Python
GDClient'a dayalı daha yeni v2.0+ sınıflarını kullanıyorsanız:
# 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)
GDataService'e dayalı eski v1.0 sınıflarını kullanıyorsanız:
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'
Süreç, RSA-SHA1 için benzerdir ancak jeton gizlisi olmadan:
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
Geri çağırma URL'sinde jeton gizli anahtarını kalıcı hale getirmeyi seçtiyseniz:
OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);
Erişim jetonuna yükseltme
OAuth jetonu dansının son adımı, yetkilendirilmiş istek jetonunu OAuthGetAccessToken URL'sini kullanarak uzun ömürlü bir erişim jetonuna yükseltmektir. Bu işlem, Web Uygulamaları İçin OAuth Kimlik Doğrulaması dokümanında ayrıntılı olarak açıklanmıştır.
Aşağıda, her bir istemci kitaplığının kullanıldığı bazı örnekler verilmiştir:
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
GDClient'a dayalı daha yeni v2.0+ sınıflarını kullanıyorsanız:
# 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)
GDataService'e dayalı eski v1.0 sınıflarını kullanıyorsanız:
access_token = client.UpgradeToOAuthAccessToken() # calls SetOAuthToken() for you
App Engine'de gdata.gauth.AeSave() kullanıyorsanız jeton ve jeton gizli anahtarı, oturum açmış olan mevcut kullanıcı için saklanır.
.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);
Not: HMAC-SHA1 kullanıyorsanız erişim jetonunun jeton gizli anahtarını veritabanınızda jeton değeriyle birlikte kaydettiğinizden emin olun. Aksi takdirde, daha sonra kullanmak üzere oauth parametrelerini düzgün şekilde yeniden oluşturamazsınız.
Erişim jetonu kullanma
Erişim jetonu aldıktan sonra hizmetle etkileşim kurmak için standart Google Data API'leri istemci kitaplığı çağrılarını kullanın. Kitaplık, istekleri imzalamak ve doğru yetkilendirme başlığını eklemekle ilgilenir. Genellikle, kullanıcının jetonunu bir çerezden veya veritabanından hatırlarsınız. Bu örneklerde, oauth parametrelerinin nasıl yeniden oluşturulacağı ve istemci kitaplığı çağrısının nasıl yapılacağı gösterilmektedir.
Java
HMAC-SHA1 kullanıyorsanız:
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 ile arasındaki fark, erişim jetonunun gizli anahtarını ayarlamanız gerekmemesi ve imzalayan nesnesinin oluşturulma şeklinin farklı olmasıdır:
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
Bu snippet'te, erişim jetonunu (HMAC-SHA1 kullanarak) zaten aldığınız ve bu jeton anahtarını/gizli anahtarını daha sonra kullanmak üzere hatırladığınız varsayılır.
GDClient'a dayalı daha yeni v2.0+ sınıflarını kullanıyorsanız:
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
GDataService'e dayalı eski v1.0 sınıflarını kullanıyorsanız:
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
HMAC-SHA1 kullanıyorsanız:
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 ile arasındaki fark, erişim jetonunun gizli anahtarını ayarlamanız gerekmemesi ve imzalayan nesnesinin oluşturulma şeklinin farklı olmasıdır:
RSA-SHA1 is not supported yet.
Ek 3 Aşamalı OAuth Kaynakları ve Örnekleri
- Google Data API Tips Blogu'nda OAuth örnekleri
- Makale: Google Veri API'leri ile OAuth'u Kullanma
- Python istemci kitaplığı örneği
- Python istemci kitaplığı Google App Engine örneği
- Java istemci kitaplığı örneği
- Java istemci kitaplığı Google App Engine örneği
- Zend PHP istemci kitaplığı örneği
- Web Uygulamaları İçin OAuth Kimlik Doğrulaması dokümanı
- OAuth.net belgeleri
2 Aşamalı OAuth
2 ayaklı OAuth, güvenilir uygulamaların kullanıcıların doğrudan katılımı olmadan Google Verileri'ne erişmesine olanak tanır. İki önemli grup, iki aşamalı OAuth kullanabilir:
G Suite alanı yöneticileri: Yöneticiler, Google Veri API'leri aracılığıyla alanlarının kullanıcı verilerini yöneten komut dosyaları ve özel uygulamalar oluşturabilir. G Suite alanınızla ilişkili anahtar ve gizli diziyi yönetme ve genel erişim kontrolü verme hakkında bilgi edinmek için "OAuth anahtarını ve gizli dizisini yönetme" başlıklı makaleyi inceleyin.
Üçüncü taraf yazılım tedarikçileri: Tedarikçiler, G Suite ile entegre olmak için iki ayaklı OAuth kullanan uygulamalar sunabilir. Üçüncü taraf uygulamalarına erişim, API istemcisini yönetin sayfasından veya G Suite Marketplace'ten yüklenerek verilebilir.
Normal yetkilendirme akışına (3 aşamalı OAuth olarak da bilinir) göre erişim jetonu gerekmez.
Aşağıdaki istemci kitaplığı örneklerinde, HMAC-SHA1 kullanarak istemcinizi 2 Bacaklı OAuth'u kullanacak şekilde nasıl ayarlayacağınız gösterilmektedir.
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
GDClient'a dayalı daha yeni v2.0+ sınıflarını kullanıyorsanız:
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
GDataService'e dayalı eski v1.0 sınıflarını kullanıyorsanız:
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); }
Ek 2 Aşamalı OAuth Kaynakları ve Örnekleri
- Google Data API Tips Blogu'nda 2 aşamalı OAuth örnekleri
- Java istemci kitaplığı 2 Bacaklı OAuth örneği
- Python istemci kitaplığı TwoLeggedOAuthExample (client.py sınıfları için) veya 2_legged_oauth örneği (service.py sınıfları için)
- .NET istemci kitaplığı 2 Bacaklı OAuth örneği
- 2 aşamalı OAuth dokümanları
Kendinden imzalı özel anahtar ve ortak sertifika oluşturma
Özel anahtar, her isteğe dahil edilmesi gereken bir imza oluşturmak için kullanılır. Sertifikaya yerleştirilmiş ortak anahtar, imzayı doğrulamak için Google tarafından kullanılır. Ortak anahtar, PEM biçiminde bir X.509 sertifikasında kodlanmış 1024 bitlik bir RSA anahtarı olmalıdır. Sertifika, kayıt sırasında Google'a gönderilmelidir.
Aşağıdaki bölümlerde, iki özel araç (OpenSSL yardımcı programı ve Java'nın keytool yardımcı programı) kullanılarak anahtar ve sertifika oluşturma örnekleri verilmektedir.
Bu örnekler Google Veri API'lerine özgü değildir. Anahtarları herhangi bir amaç için oluşturmak üzere aynı yardımcı programları kullanabilirsiniz.
Örneklerde, şirketinizin adının My_Company olduğu ve ABD'nin Kaliforniya eyaletindeki Mountain View şehrinde bulunduğu, alan adının ise example.com olduğu varsayılmaktadır.
OpenSSL kullanarak anahtar oluşturma
RSA anahtar çifti ve ilgili sertifikayı oluşturmak için aşağıdaki komutu kullanabilirsiniz:
# 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
Uyarı: -nodes parametresinin eklenmesi, koruyucu şifresi olmayan bir özel anahtar oluşturur.
Ancak, güvenliği artırmak için bu parametreyi atlamayı düşünebilirsiniz.
-sha1 parametresi, anahtarın SHA1 imzaları oluşturmak için kullanılacağını belirtir.
-subj parametresi, sertifikanın temsil ettiği uygulamanın kimliğini belirtir.
-keyout parametresi, anahtarları içerecek dosyayı belirtir.
Bu dosya hassas bilgiler içerir, korunmalı ve kimseyle paylaşılmamalıdır.
-out parametresi, PEM biçiminde sertifika içeren dosyayı belirtir
(kayıt sırasında Google'a gönderilebilir).
.NET istemcisi için anahtar oluşturma
.NET Framework, PEM biçiminde depolanan anahtarları veya sertifikaları anlamaz. Bu nedenle, .pem dosyasını oluşturduktan sonra ek bir adım uygulamanız gerekir:
openssl pkcs12 -export -in test_cert.pem -inkey myrsacert.pem -out myrsacert.pfx -name "Testing Certificate"
Bu adımda, özel anahtarınız ve sertifikanızdan bir PFX dosyası oluşturulur. Bu dosya, Google Veri API'lerine yapılan istekleri dijital olarak imzalamak için .NET istemci kitaplığına aktarılabilir.
Java istemcisi için anahtar oluşturma
Java istemcisi, PKCS#8 biçimindeki özel anahtarları kabul eder. Yukarıdaki talimatları kullanarak anahtar/sertifika oluşturduktan sonra, oluşturduğunuz .pem dosyasından bir .pk8 dosyası oluşturun:
openssl pkcs8 -in myrsakey.pem -topk8 -nocrypt -out myrsakey.pk8
Alternatif olarak, RSA anahtarları çifti ve ilgili sertifikayı oluşturmak için Java anahtar deposunu ve keytool yardımcı programını kullanabilirsiniz. Aşağıdaki komutu kullanın:
# 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
Uyarı: "changeme" iyi bir şifre değildir. Bu yalnızca bir örnektir.
-dname parametresi, sertifikanın temsil ettiği uygulamanın kimliğini belirtir. -storepass parametresi, anahtar deposunu korumak için kullanılacak şifreyi belirtir. -keypass parametresi, özel anahtarı koruyacak şifreyi belirtir.
Sertifikayı ManageDomains aracında kullanılabilecek bir dosyaya yazmak için aşağıdaki komutu kullanın:
# Output the public certificate to a file keytool -export -rfc -keystore ./Example.jks -storepass changeme \ -alias Example -file mycert.pem