OAuth di Library Klien Protokol Data Google

Peringatan: Halaman ini membahas API lama Google, yaitu Google Data API; halaman ini hanya relevan dengan API yang tercantum dalam direktori Google Data API, banyak di antaranya telah diganti dengan API yang lebih baru. Untuk informasi tentang API baru tertentu, lihat dokumentasi API baru. Untuk informasi tentang memberi otorisasi permintaan dengan API baru, lihat Autentikasi dan Otorisasi Akun Google.

Dokumen ini menjelaskan cara menggunakan library klien Google Data API untuk terhubung ke Autentikasi OAuth untuk Aplikasi Web Google.

Antarmuka OAuth memungkinkan aplikasi berbasis web mengakses layanan Google atas nama pengguna. Untuk mempertahankan tingkat keamanan yang tinggi, OAuth memungkinkan aplikasi mendapatkan token akses tanpa harus menangani informasi login akun pengguna.

Library klien Google Data API menyediakan metode untuk membantu Anda menggunakan OAuth di aplikasi web. Secara khusus, ada metode untuk membuat token permintaan, memberi otorisasi token permintaan, dan menukarkan token permintaan yang diotorisasi dengan token akses. Library ini juga menangani algoritme penandatanganan yang diperlukan saat membuat permintaan ke layanan Data Google.

Audiens

Dokumen ini ditujukan bagi programmer yang ingin agar aplikasi berbasis web mereka mengakses layanan Google atas nama pengguna, menggunakan library klien Google Data API.

Dokumen ini mengasumsikan bahwa Anda telah memahami antarmuka OAuth dan proses umum untuk memasukkan OAuth ke dalam aplikasi web. Untuk mengetahui deskripsi lengkap protokol OAuth, lihat Autentikasi OAuth untuk Aplikasi Web atau spesifikasi resmi di oauth.net.

Menggunakan 3-cab OAuth dan Google Data API tanpa library klien

Jika ingin aplikasi web Anda berinteraksi dengan layanan Data Google menggunakan OAuth sebagai metode otorisasi, semua yang perlu Anda ketahui ada di Autentikasi OAuth untuk Aplikasi Web. Anda tidak perlu menggunakan library klien Google Data API jika tidak menginginkannya.

Berikut adalah garis besar tentang cara aplikasi Anda mengautentikasi pengguna menggunakan OAuth:

  1. Aplikasi Anda membuat permintaan yang ditandatangani untuk mengambil token permintaan OAuth awal dari endpoint OAuthRequestToken.
  2. Aplikasi Anda mengalihkan pengguna ke URL OAuthAuthorizeToken yang sesuai untuk memberi otorisasi token permintaan.
  3. Setelah memberikan akses, pengguna akan dialihkan kembali ke aplikasi Anda (URL oauth_callback)
  4. Aplikasi Anda mengirim permintaan yang ditandatangani untuk mengupgrade token permintaan yang diotorisasi ke token akses menggunakan endpoint OAuthGetAccessToken.

Library klien Google Data API menyederhanakan proses otorisasi ini dengan menangani berbagai detail untuk Anda. Dokumen ini menjelaskan caranya.

Mendaftarkan aplikasi web Anda

OAuth mewajibkan semua panggilan API ditandatangani secara digital. Google mendukung metode tanda tangan HMAC-SHA1 dan RSA-SHA1. Untuk menandatangani permintaan, aplikasi Anda harus mendaftar ke Google terlebih dahulu. Setelah Anda mendaftar, Google akan memberi Anda kunci konsumen (dan rahasia untuk digunakan dengan HMAC-SHA1), serta tempat untuk mengupload sertifikat publik.

1. Mendaftarkan domain Anda

Ikuti langkah-langkah yang dijelaskan dalam Pendaftaran untuk Aplikasi Berbasis Web.

2. Membuat pasangan kunci pribadi / sertifikat publik (opsional)

Jika Anda memilih menggunakan RSA-SHA1 sebagai oauth_signature_method, Anda harus membuat pasangan kunci pribadi dan sertifikat publik RSA. Lihat Membuat kunci pribadi dan sertifikat publik yang ditandatangani sendiri (di bawah) untuk mengetahui contoh cara melakukannya.

Bekerja dengan OAuth 3 cabang dan Google Data API: contoh library klien

Bagian berikut menunjukkan contoh penggunaan metode library klien Google Data API untuk mengikuti langkah-langkah yang diuraikan di bagian "Menggunakan OAuth" dalam dokumentasi OAuth. Semua contoh dalam dokumen ini mengasumsikan bahwa domain host aplikasi Anda adalah example.com.

Menentukan cakupan akses data Anda

Setiap layanan Google menentukan nilai scope yang menentukan akses token ke data pengguna. Nilai cakupan yang tersedia tercantum dalam FAQ Data Google. Misalnya, untuk menggunakan API Daftar Dokumen, tetapkan scope ke https://docs.google.com/feeds/, seperti yang tercantum dalam FAQ.

Catatan: Tetapkan nilai scope ke URL paling sempit yang mengizinkan akses yang Anda perlukan. Tindakan ini mengurangi kemungkinan tidak sengaja mendapatkan dan membocorkan data pribadi. Misalnya, jika Anda ingin mengakses feed Daftar Dokumen pribadi pengguna saat ini, gunakan cakupan https://docs.google.com/feeds/default/private/full, bukan cakupan yang lebih luas seperti https://docs.google.com/feeds/, yang memberikan akses ke semua feed Daftar Dokumen.

Token multi-cakupan

Untuk membuat token yang mengakses beberapa Google Data API, pisahkan setiap cakupan dengan karakter spasi. Contoh di bawah membuat token dengan akses ke data Google Dokumen dan Google Kalender pengguna.

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

Karakter non-ASCII yang muncul di URL, termasuk titik dua, garis miring, dan spasi, harus dienkodekan URL agar dapat dikirim melalui HTTP. Library klien Google Data API secara otomatis mengenkode parameter URL untuk Anda, sehingga Anda cukup menggunakan string berenkode non-URL saat menetapkan nilai ke parameter. Misalnya, Anda dapat membuat tugas berikut dalam kode Anda:

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

Saat Anda memanggil library klien, parameter scope akan otomatis dienkode ke URL dengan nilai berikut:
https%3a%2f%2fwww.google.com%2fcalendar%2ffeeds%2f+https%3a%2f%2fdocs.google.com%2ffeeds%2f

Mengambil token permintaan

Java

Untuk HMAC-SHA1, Anda memerlukan beberapa cara untuk mempertahankan rahasia token (diperoleh dalam respons) untuk membuat objek token OAuth kembali dari halaman persetujuan. Untuk melakukannya, tetapkan variabel sesi atau 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);

Dengan menggunakan RSA-SHA1, oauth_token_secret tidak digunakan sehingga tidak perlu menyimpan rahasia token.

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

Menggunakan HMAC-SHA1 sebagai metode tanda tangan:

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

Menggunakan RSA-SHA1 sebagai metode tanda tangan:

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

Menggunakan HMAC-SHA1 sebagai metode tanda tangan:

Jika Anda menggunakan class v2.0+ yang lebih baru berdasarkan GDClient, gunakan:

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

Menggunakan RSA-SHA1 sebagai metode tanda tangan:

...

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)

Atau, jika Anda menggunakan class v1.0 yang lebih lama berdasarkan GDataService, panggilannya akan sedikit berbeda:

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)

Menggunakan RSA-SHA1 sebagai metode tanda tangan:

...

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

Menggunakan HMAC-SHA1 sebagai metode tanda tangan:

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

Menggunakan RSA-SHA1 sebagai metode tanda tangan:

RSA-SHA1 is not supported yet.

Memberi otorisasi pada token permintaan

Untuk mengizinkan token permintaan, aplikasi Anda harus mengalihkan pengguna ke URL OAuthAuthorizeToken, yang akan meminta mereka untuk login ke akun Google. Untuk informasi selengkapnya tentang URL OAuthAuthorizeToken, lihat Autentikasi OAuth lengkap untuk Aplikasi Web.

Untuk membuat URL OAuthAuthorizeToken di aplikasi Anda, gunakan hal berikut untuk setiap library klien. Perhatikan bahwa contoh ini dibuat berdasarkan contoh sebelumnya.

Setelah membuat URL halaman persetujuan, aplikasi Anda dapat menggunakannya dalam berbagai cara untuk mengarahkan pengguna ke pengendali OAuthAuthorizeToken. Pendekatan yang paling umum adalah mengalihkan pengguna atau menampilkan link ke halaman tersebut.

Java

Untuk HMAC-SHA1:

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

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

Atau, Anda dapat mengalihkan ke URL persetujuan:

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

Python

Jika Anda menggunakan class v2.0+ yang lebih baru berdasarkan GDClient, gunakan:

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

Jika Anda menggunakan class v1.0 yang lebih lama berdasarkan GDataService, prosesnya akan sedikit berbeda.

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

Mengekstrak token dari URL callback

Saat Google mengalihkan kembali ke aplikasi Anda, oauth_token akan ditambahkan ke URL "oauth_callback_url" sebagai parameter kueri. Aplikasi Anda kemudian harus mengekstrak nilai token dari parameter kueri URL-nya dan menetapkan kembali parameter oauth.

Library klien menyediakan metode praktis untuk mengekstrak oauth_token. Contoh ini dibuat berdasarkan contoh sebelumnya.

Java

Jika Anda memilih untuk mempertahankan rahasia token di URL callback (saat menggunakan 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);

Satu-satunya perbedaan dengan RSA-SHA1 adalah metode penandatanganannya:

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

Langkah ini tidak diperlukan saat menggunakan library PHP.

Python

Jika Anda menggunakan class v2.0+ yang lebih baru berdasarkan GDClient, gunakan:

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

Jika Anda menggunakan class v1.0 yang lebih lama berdasarkan GDataService, gunakan:

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'

Prosesnya mirip dengan RSA-SHA1, tetapi tanpa rahasia token:

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

Jika Anda memilih untuk mempertahankan rahasia token di URL callback:

OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);

Mengupgrade ke token akses

Langkah terakhir dalam tarian token OAuth adalah mengupgrade token permintaan yang diotorisasi ke token akses yang berumur panjang menggunakan URL OAuthGetAccessToken, seperti yang dijelaskan dalam dokumentasi Autentikasi OAuth untuk Aplikasi Web lengkap.

Berikut adalah beberapa contoh yang menggunakan setiap library klien:

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

Jika Anda menggunakan class v2.0+ yang lebih baru berdasarkan GDClient, gunakan:

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

Jika Anda menggunakan class v1.0 yang lebih lama berdasarkan GDataService, gunakan:

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

Jika Anda menggunakan gdata.gauth.AeSave() di App Engine, token dan rahasia token akan disimpan untuk Anda di bawah pengguna yang login saat ini.

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

Catatan: Jika Anda menggunakan HMAC-SHA1, pastikan untuk menyimpan rahasia token akses bersama dengan nilai token dalam database, jika tidak, Anda tidak akan dapat merekonstruksi parameter oauth dengan benar untuk digunakan nanti.

Menggunakan token akses

Setelah Anda memperoleh token akses, gunakan panggilan library klien Google Data API standar untuk berinteraksi dengan layanan. Library akan menangani penandatanganan permintaan dan menyertakan header Otorisasi yang benar untuk Anda. Biasanya, Anda akan menarik token pengguna dari cookie atau database. Contoh ini menunjukkan cara merekonstruksi parameter oauth dan membuat panggilan library klien.

Java

Jika Anda menggunakan 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());
  }
  

Perbedaannya dengan RSA-SHA1 adalah Anda tidak perlu menetapkan rahasia token akses dan membuat objek penanda tangan berbeda:

  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

Cuplikan ini mengasumsikan bahwa Anda telah mengambil token akses (menggunakan HMAC-SHA1) dan menarik kembali kunci/rahasia token tersebut untuk digunakan nanti.

Jika Anda menggunakan class v2.0+ yang lebih baru berdasarkan GDClient, gunakan:

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

Jika Anda menggunakan class v1.0 yang lebih lama berdasarkan GDataService, gunakan:

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

Jika Anda menggunakan 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);
}

Perbedaannya dengan RSA-SHA1 adalah Anda tidak perlu menetapkan rahasia token akses dan membuat objek penanda tangan berbeda:

RSA-SHA1 is not supported yet.

Referensi dan Referensi OAuth 3-Legged Tambahan

Kembali ke atas

2 OAuth Terpasang

OAuth 2 OAuth memungkinkan aplikasi tepercaya mengakses Data Google pengguna tanpa interaksi langsung mereka. Dua grup kunci dapat menggunakan OAuth berkaki dua:

Administrator domain G Suite: Administrator dapat membuat skrip dan aplikasi kustom yang mengelola data pengguna untuk domain mereka melalui Google Data API. Untuk mempelajari cara mengelola kunci dan rahasia yang terkait dengan domain G Suite Anda, dan memberikan kontrol akses global, lihat "Mengelola kunci dan rahasia OAuth".

Vendor software pihak ketiga: Vendor dapat menawarkan aplikasi yang menggunakan OAuth berkaki dua untuk berintegrasi dengan G Suite. Akses untuk aplikasi pihak ketiga dapat diberikan di halaman klien Manage API atau dengan menginstal dari G Suite Marketplace.

Token akses tidak diperlukan sesuai dengan alur otorisasi normal (juga disebut sebagai OAuth 3 cabang).

Contoh library klien berikut menunjukkan cara menyiapkan klien Anda untuk menggunakan 2 Legged OAuth menggunakan 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

Jika Anda menggunakan class v2.0+ yang lebih baru berdasarkan GDClient, gunakan:

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

Jika Anda menggunakan class v1.0 yang lebih lama berdasarkan GDataService, gunakan:

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

Referensi dan Referensi OAuth 2-Legged Tambahan

Membuat kunci pribadi dan sertifikat publik yang ditandatangani sendiri

Kunci pribadi digunakan untuk membuat tanda tangan, yang harus disertakan pada setiap permintaan. Kunci publik yang disematkan dalam sertifikat digunakan oleh Google untuk memverifikasi tanda tangan. Kunci publik harus berupa kunci RSA 1024-bit yang dienkode dalam sertifikat X.509 dalam format PEM. Sertifikat harus dikirimkan ke Google pada saat pendaftaran.

Bagian berikut memberikan contoh cara membuat kunci dan sertifikat menggunakan dua alat tertentu: utilitas OpenSSL dan utilitas keytool Java.

Contoh ini tidak khusus untuk Google Data API; Anda dapat menggunakan aplikasi utilitas yang sama untuk membuat kunci untuk tujuan apa pun.

Contoh ini mengasumsikan bahwa perusahaan Anda bernama My_Company, dan berlokasi di Mountain View, California, AS, dengan nama domain example.com.

Membuat kunci menggunakan OpenSSL

Untuk membuat pasangan kunci RSA dan sertifikat yang sesuai, Anda dapat menggunakan perintah berikut:

# 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

Peringatan: Menyertakan parameter -nodes akan membuat kunci pribadi tanpa sandi untuk melindunginya. Namun, Anda harus mempertimbangkan penghapusan parameter ini untuk keamanan tambahan.

Parameter -sha1 menentukan bahwa kunci tersebut akan digunakan untuk membuat tanda tangan SHA1.

Parameter -subj menentukan identitas aplikasi yang diwakili oleh sertifikat.

Parameter -keyout menentukan file yang akan berisi kunci. File ini berisi informasi sensitif dan harus dilindungi serta tidak dibagikan kepada siapa pun.

Parameter -out menentukan file yang akan berisi sertifikat dalam format PEM (yang dapat dikirim ke Google saat mendaftar).

Membuat kunci untuk klien .NET

Framework .NET tidak memahami kunci atau sertifikat yang disimpan dalam format PEM. Oleh karena itu, langkah tambahan diperlukan setelah Anda membuat file .pem:

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

Langkah ini akan membuat file PFX dari kunci pribadi dan sertifikat Anda. File ini dapat diimpor ke library klien .NET untuk menandatangani permintaan yang dibuat ke Google Data API secara digital.

Membuat kunci untuk klien Java

Klien Java menerima kunci pribadi dalam format PKCS#8. Setelah membuat kunci/sertifikat menggunakan petunjuk di atas, buat file .pk8 dari file .pem yang dihasilkan:

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

Atau, Anda dapat menggunakan key store Java dan utilitas keytool untuk membuat sepasang kunci RSA dan sertifikat yang sesuai. Gunakan perintah berikut:

# 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

Peringatan: "changeme" bukan sandi yang baik; ini hanyalah contoh.

Parameter -dname menentukan identitas aplikasi yang diwakili oleh sertifikat. Parameter -storepass menentukan sandi untuk melindungi keystore. Parameter -keypass menentukan sandi untuk melindungi kunci pribadi.

Untuk menulis sertifikat ke file yang dapat digunakan di alat ManageDomains, gunakan perintah berikut:

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

Kembali ke atas