Google Veri Protokolü İstemci Kitaplıkları'ndaki OAuth

Uyarı: Bu sayfa, Google'ın eski API'leri olan Google Veri API'leriyle ilgilidir. Bu sayfalar, çoğu yeni API'lerle değiştirilen Google Veri API'leri dizininde listelenen API'lerle ilgilidir. Belirli bir yeni API ile ilgili bilgi edinmek için yeni API'nin belgelerine bakabilirsiniz. Yeni bir API ile istekleri yetkilendirme hakkında bilgi için Google Hesaplarında Kimlik Doğrulama ve Yetkilendirme başlıklı makaleyi inceleyin.

Bu dokümanda, Google'ın Web Uygulamaları için OAuth Kimlik Doğrulaması'na bağlanmak üzere Google Data API istemci kitaplıklarının nasıl kullanılacağı açıklanmaktadır.

OAuth arayüzü, web tabanlı bir uygulamanın bir kullanıcı adına Google hizmetine erişmesine izin verir. Yüksek düzeyde güvenlik sağlamak için OAuth, uygulamanın kullanıcının hesap giriş bilgilerini işlemeden erişim jetonu almasını sağlar.

Google Data API istemci kitaplıkları, web uygulamanızda OAuth kullanmanıza yardımcı olacak yöntemler sunar. Özel olarak; istek jetonu oluşturma, istek jetonunu yetkilendirme ve bir erişim jetonu için yetkili istek jetonunu değiştirme yöntemleri vardır. Kitaplıklar, bir Google Veri hizmetine istek yaparken gerekli imzalama algoritmalarını da işler.

Kitle

Bu belge, Google Veri API'leri istemci kitaplıklarını kullanarak web tabanlı uygulamalarının kullanıcılar adına Google hizmetlerine erişmesini isteyen programcılar için hazırlanmıştır.

Bu dokümanda, OAuth arayüzüne ve OAuth'u web uygulamanıza entegre etmeye yönelik genel sürece aşina olduğunuz varsayılmıştır. OAuth protokolünün tam açıklaması için Web Uygulamaları İçin OAuth Kimlik Doğrulaması veya oauth.net adresindeki resmi spesifikasyonu inceleyin.

İstemci kitaplıkları olmadan 3 aşamalı OAuth ve Google Veri API'larını kullanma

Web uygulamanızın, yetkilendirme yöntemi olarak OAuth kullanarak bir Google Veri hizmetiyle etkileşimde bulunmasını istiyorsanız bilmeniz gereken her şeyi Web Uygulamaları iç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 bir kullanıcının kimliğini nasıl doğrulayabileceğine dair bir özet aşağıda verilmiştir:

  1. Uygulamanız, OAuthRequestToken uç noktasından ilk OAuth istek jetonunu getirmek için imzalı bir istek yapar.
  2. Uygulamanız, istek jetonunu yetkilendirmek için kullanıcıyı ilgili OAuthAuthorizeToken URL'sine yönlendirir.
  3. Erişim izni verdikten sonra kullanıcı tekrar uygulamanıza (oauth_callback URL) yönlendirilir.
  4. Uygulamanız, OAuthGetAccessToken uç noktasını kullanarak yetkili istek jetonunu erişim jetonuna yükseltmek için imzalı bir istek gönderir.

Google Veri API'leri istemci kitaplıkları, sizin için çeşitli ayrıntıları işleyerek bu yetkilendirme işlemini basitleştirir. Bu dokümanda bunun 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 Google'a kaydolması gerekir. Kaydolduktan sonra Google size bir tüketici anahtarı (ve HMAC-SHA1 ile kullanılacak gizli anahtar) ve genel sertifika yükleyebileceğiniz bir yer sağlar.

1. Alanınız kaydediliyor

Lütfen Web Tabanlı Uygulamalar için Kayıt bölümünde açıklanan 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ı RSA özel anahtar ve genel sertifika çifti oluşturmanız gerekir. Bunun nasıl yapılacağına ilişkin örnekler için Kendinden imzalı özel anahtar ve genel sertifika oluşturma (aşağıda) bölümüne bakın.

3 aşamalı OAuth ve Google Veri API'leriyle çalışma: istemci kitaplığı örnekleri

Aşağıdaki bölümlerde, OAuth dokümanlarının "OAuth ile Çalışma" bölümünde açıklanan 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 ana makine alanınızın example.com olduğu varsayılmıştır.

Veri erişiminizin kapsamını belirleme

Her Google hizmeti, jetonların 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, Belgeler Listesi API'sini kullanmak için SSS bölümünde gösterildiğ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 verileri yanlışlıkla elde etme ve sızdırma olasılığını azaltır. Örneğin, mevcut kullanıcının gizli Doküman Listesi feed'ine erişmek isterseniz 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 çok Google Veri API'sine erişen jetonlar oluşturmak için her bir kapsamı bir boşluk karakteriyle ayırın. Aşağıdaki örnekte, hem kullanıcının Google Dokümanlarına hem de Google Takvim verilerine erişimi olan bir jeton oluşturulur.

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

İki nokta üst üste, eğik çizgi ve boşluk dahil olmak üzere URL'lerde görünen ASCII olmayan karakterlerin HTTP üzerinden iletilebilmesi için URL olarak kodlanması gerekir. Google Data API istemci kitaplıkları, parametreleri sizin için otomatik olarak URL kodlaması yapar. Böylece, parametrelere değer atarken URL kodlamalı dizeler 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 şu şekilde URL olarak kodlanır:
https%3a%2f%2fwww.google.com%2fcalendar%2ffeeds%2f+https%3a%2f%2fdocs.google.com%2ffeeds%2f

İstek jetonu alma

Java

HMAC-SHA1 için, onay sayfasından geri gelen bir OAuth jetonu nesnesi oluşturmak üzere jeton gizli anahtarını (yanıtta edinilen) kalıcı hale getirmeniz gerekir. Bunun için bir oturum değişkeni veya çerez belirleyin.

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ılmadığı için jeton gizli anahtarını saklamaya gerek kalmaz.

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 kullanılıyor:

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 kullanılıyor:

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 kullanılıyor:

GDClient'ı temel alan 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 kullanılıyor:

...

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ı olarak eski 1.0 v. sınıflarını kullanıyorsanız aramalar biraz daha 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 kullanılıyor:

...

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 kullanılıyor:

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 kullanılıyor:

RSA-SHA1 is not supported yet.

İstek jetonunu yetkilendirme

Bir istek jetonunu yetkilendirmek için uygulamanızın, kullanıcıyı Google hesabına giriş yapmasını isteyen OAuthAuthorizeToken URL'sine yönlendirmesi gerekir. OAuthAuthorizeToken URL'si hakkında daha fazla bilgi için Web Uygulamaları için OAuth Kimlik Doğrulaması'nın tamamına bakın.

Uygulamanızda OAuthAuthorizeToken URL'si oluşturmak için her istemci kitaplığında aşağıdakileri kullanın. Bu örneklerin önceki örneklere dayandığını unutmayın.

Onay sayfası URL'si oluşturulduktan sonra uygulamanız, kullanıcıyı OAuthAuthorizeToken işleyicisine göndermek için çeşitli şekillerde kullanabilir. En yaygın yaklaşım, kullanıcıyı yönlendirmek veya söz konusu sayfanın bağlantısını görüntülemektir.

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 de 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'ı temel alan 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ı olarak 1.0 sürümündeki eski sınıfları kullanıyorsanız süreç biraz daha 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 tekrar yönlendirme yaptığında oauth_token, "oauth_callback_url" URL'sine bir sorgu parametresi olarak eklenir. Bu durumda uygulamanız, jeton değerini URL sorgu parametresinden almalı ve oauth parametrelerini yeniden oluşturmalıdır.

İstemci kitaplıkları, oauth_token dosyasını ayıklamak için kolay yöntemler sunar. Bu örnekler önceki örneklere dayanır.

Java

Geri çağırma URL'sinde jeton gizli anahtarını saklamayı seçtiyseniz (HMAC-SHA1 kullanırken):

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 arasındaki 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ığını kullanırken bu adım gerekli değildir.

Python

GDClient'ı temel alan 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ı olarak 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'

Bu işlem RSA-SHA1 için benzerdir ancak jeton gizli anahtarı yoktur:

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ı saklamayı seçtiyseniz:

OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);

Erişim jetonuna geçme

OAuth jetonu dansının son adımı, tam Web Uygulamaları için OAuth Kimlik Doğrulaması dokümanlarında açıklandığı şekilde OAuthGetAccessToken URL'sini kullanarak yetkili istek jetonunu uzun ömürlü bir erişim jetonuna yükseltmektir.

Aşağıda, istemci kitaplıklarının her birini kullanan 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'ı temel alan 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ı olarak 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 geçerli kullanıcının altında sizin için depolanı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ızdaki jeton değerinin yanında kaydettiğinizden emin olun. Aksi takdirde, OAuth parametrelerini daha sonra kullanmak üzere düzgün şekilde yeniden oluşturamazsınız.

Erişim jetonu kullanma

Bir erişim jetonu aldıktan sonra hizmetle etkileşimde bulunmak için standart Google Data API'leri istemci kitaplığı çağrılarını kullanın. Kitaplık, istekleri imzalar ve sizin için doğru Yetkilendirme üst bilgisini ekler. Genellikle, bir jeton veya veritabanından kullanıcının jetonunu hatırlarsınız. Bu örnekler, oauth parametrelerinin nasıl yeniden oluşturulacağını ve bir istemci kitaplığı çağrısının nasıl yapılacağını göstermektedir.

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 sırrını ayarlamanıza gerek olmaması ve imzalayanın yapısının 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, bir erişim jetonu (HMAC-SHA1 kullanarak) önceden aldığınızı ve bu jeton anahtarını/gizli anahtarı daha sonra kullanmak için geri çağırdığınızı varsayar.

GDClient'ı temel alan 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ı olarak 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 sırrını ayarlamanıza gerek olmaması ve imzalayanın yapısının farklı olmasıdır:

RSA-SHA1 is not supported yet.

Ek 3 Aşamalı OAuth Kaynakları ve Örnekleri

Başa dön

2 Aşamalı OAuth

2 aşamalı OAuth, güvenilir uygulamaların kullanıcıların doğrudan katılımı olmadan Google verilerine erişmesine olanak tanır. İki önemli grup iki aşamalı OAuth kullanabilir:

G Suite alan yöneticileri: Yöneticiler, Google Data API'leri aracılığıyla alanları için kullanıcı verilerini yöneten komut dosyaları ve özel uygulamalar oluşturabilir. G Suite alanınızla ilişkili anahtar ve gizli anahtarı yönetme ve genel erişim denetimi verme hakkında bilgi edinmek için "OAuth anahtarını ve sırrını yönetme" başlıklı makaleye bakın.

Üçüncü taraf yazılım sağlayıcıları: Tedarikçi firmalar, G Suite ile entegrasyon için iki aşamalı OAuth kullanan uygulamalar sunabilir. Üçüncü taraf uygulamalarına erişim izni, API istemcisini yönet sayfasında veya G Suite Marketplace'ten yüklenebilir.

Normal yetkilendirme akışına (3 aşamalı OAuth olarak da adlandırılır) göre erişim jetonu gerekli değildir.

Aşağıdaki istemci kitaplığı örnekleri, istemcinizi HMAC-SHA1 kullanarak 2 Aşamalı OAuth kullanacak şekilde nasıl ayarlayacağınızı göstermektedir.

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'ı temel alan 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ı olarak 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

Kendinden imzalı özel anahtar ve genel 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, Google tarafından imzayı doğrulamak için kullanılır. Ortak anahtar, XEM 509 sertifikasıyla kodlanan 1024 bit RSA anahtarı olmalıdır. Sertifika, kayıt sırasında Google'a gönderilmelidir.

Aşağıdaki iki araçta anahtar ve sertifika oluşturma örnekleri verilmiştir: OpenSSL yardımcı programı ve Java'nın keytool yardımcı programı.

Bu örnekler Google Veri API'lerine özel değildir. Herhangi bir amaçla anahtar oluşturmak için aynı yardımcı programlardan yararlanabilirsiniz.

Örnekler, şirketinizin Şirketim_adı olduğunu ve example.com alan adıyla Mountain View, Kaliforniya, ABD'de bulunduğunu varsayar.

OpenSSL kullanarak anahtar oluşturma

Bir RSA anahtarı ve ilgili sertifika 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 parametresini eklemek, korumak için şifre olmadan bir özel anahtar oluşturur. Ancak, daha fazla güvenlik için bu parametreyi kullanmamanız önerilir.

-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çerdiği için kimseyle paylaşılmamalıdır.

-out parametresi, sertifikayı içerecek dosyayı belirtir. PEM biçimindedir (kayıt sırasında Google'a gönderilebilir).

.NET istemcisi için anahtar oluşturma

.NET çerçevesi, PEM biçiminde depolanan anahtarları veya sertifikaları anlamaz. Bu nedenle, .pem dosyasını oluşturduktan sonra ek bir adım yapmanız gerekir:

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

Bu adım, özel anahtar ve sertifikanızdan bir PFX dosyası oluşturur. 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çiminde özel anahtarları kabul eder. Yukarıdaki talimatları uygulayarak bir anahtar/sertifika oluşturduktan sonra, oluşturduğunuz .pem dosyasından .pk8 dosyası oluşturun:

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

Alternatif olarak, bir RSA anahtarı 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ı korumak için kullanılacak ş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

Başa dön