Peringatan: Halaman ini membahas API lama Google, yaitu Google Data API; halaman ini hanya relevan dengan API yang tercantum dalam direktori Google Data API, yang sebagian besar telah diganti dengan API yang lebih baru. Untuk mengetahui informasi tentang API baru tertentu, lihat dokumentasi API baru tersebut. Untuk mengetahui informasi tentang cara mengizinkan permintaan dengan API yang lebih 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 pernah 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 permintaan token, mengizinkan permintaan token, dan menukar permintaan token yang diizinkan dengan token akses. Library ini juga menangani algoritma penandatanganan yang diperlukan saat membuat permintaan ke layanan Data Google.
Audiens
Dokumen ini ditujukan bagi programmer yang ingin aplikasi berbasis web mereka mengakses layanan Google atas nama pengguna, menggunakan library klien Google Data API.
Dokumen ini mengasumsikan bahwa Anda sudah memahami antarmuka OAuth dan proses umum untuk menggabungkan OAuth ke dalam aplikasi web Anda. Untuk deskripsi lengkap protokol OAuth, lihat Autentikasi OAuth untuk Aplikasi Web atau spesifikasi resmi di oauth.net.
Menggunakan OAuth 3-legged dan Google Data API tanpa library klien
Jika Anda ingin aplikasi web berinteraksi dengan layanan Data Google menggunakan OAuth sebagai metode otorisasi, maka semua yang perlu Anda ketahui ada di Autentikasi OAuth untuk Aplikasi Web. Anda tidak perlu menggunakan library klien Google Data API jika tidak ingin.
Berikut adalah garis besar cara aplikasi Anda dapat mengautentikasi pengguna menggunakan OAuth:
- Aplikasi Anda membuat permintaan bertanda tangan untuk mengambil token permintaan OAuth awal dari endpoint
OAuthRequestToken. - Aplikasi Anda mengalihkan pengguna ke URL
OAuthAuthorizeTokenyang sesuai untuk memberikan otorisasi pada token permintaan. - Setelah memberikan akses, pengguna akan dialihkan kembali ke aplikasi Anda (URL
oauth_callback) - Aplikasi Anda mengirim permintaan bertanda tangan untuk mengupgrade token permintaan yang diizinkan menjadi 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 mengharuskan 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 diuraikan dalam Pendaftaran untuk Aplikasi Berbasis Web.
2. Membuat pasangan kunci pribadi / sertifikat publik (opsional)
Jika memilih untuk menggunakan RSA-SHA1 sebagai oauth_signature_method, Anda harus membuat pasangan kunci pribadi dan sertifikat publik RSA
penandatanganan sendiri. Lihat Membuat kunci pribadi dan sertifikat publik penandatanganan sendiri
(di bawah) untuk mengetahui contoh cara melakukannya.
Bekerja dengan OAuth 3-legged dan Google Data API: contoh library klien
Bagian berikut menunjukkan contoh penggunaan metode library klien Google Data API untuk mengikuti langkah-langkah yang diuraikan dalam bagian
"Bekerja dengan 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 Documents List API, tetapkan scope ke https://docs.google.com/feeds/, seperti yang tercantum dalam FAQ.
Catatan: Tetapkan nilai scope ke URL tersempit yang mengizinkan akses yang Anda butuhkan. Tindakan ini mengurangi kemungkinan mendapatkan dan membocorkan data pribadi secara tidak sengaja. 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/
Pengenkodean URL
Karakter non-ASCII yang muncul di URL, termasuk titik dua, garis miring, dan spasi, harus dienkode ke URL agar dapat ditransmisikan melalui HTTP. Library klien Google Data API otomatis mengenkode parameter URL untuk Anda, sehingga Anda cukup menggunakan string yang tidak dienkode URL saat menetapkan nilai ke parameter. Misalnya, Anda dapat membuat penetapan 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 URL ke 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 cara untuk mempertahankan secret token (yang diperoleh dalam respons) guna membuat objek token OAuth yang kembali
dari halaman persetujuan. Untuk melakukannya, tetapkan variabel atau cookie sesi.
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 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 token permintaan
Untuk mengizinkan token permintaan, aplikasi Anda harus mengalihkan pengguna ke URL OAuthAuthorizeToken, yang akan meminta mereka untuk login ke Akun Google mereka.
Untuk mengetahui informasi selengkapnya tentang URL OAuthAuthorizeToken, lihat
Autentikasi OAuth untuk Aplikasi Web lengkap.
Untuk membuat URL OAuthAuthorizeToken di aplikasi Anda, gunakan kode berikut untuk setiap library klien. Perhatikan bahwa contoh ini dibuat berdasarkan contoh sebelumnya.
Setelah membuat URL halaman persetujuan, aplikasi Anda dapat menggunakannya dengan berbagai cara untuk mengirim pengguna ke handler
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 cukup 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.
Kemudian, aplikasi Anda harus mengekstrak nilai token dari parameter kueri URL-nya dan membuat ulang parameter oauth.
Library klien menyediakan metode praktis untuk mengekstrak oauth_token. Contoh ini dibuat berdasarkan contoh sebelumnya.
Java
Jika Anda telah 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 penandatanganan:
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 serupa untuk 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);
Melakukan upgrade ke token akses
Langkah terakhir dalam proses token OAuth adalah mengupgrade token permintaan yang diotorisasi menjadi token akses yang berlaku lama menggunakan URL OAuthGetAccessToken, seperti yang dijelaskan dalam dokumentasi Autentikasi OAuth untuk Aplikasi Web lengkap.
Berikut beberapa contoh penggunaan 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 secret token akan disimpan untuk Anda di bawah pengguna yang saat ini login.
.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 secret token akses
bersama nilai token di database Anda. Jika tidak, Anda tidak akan dapat merekonstruksi parameter oauth dengan benar untuk digunakan nanti.
Menggunakan token akses
Setelah mendapatkan 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 memanggil kembali token pengguna dari cookie atau database. Contoh ini menunjukkan cara merekonstruksi parameter oauth dan melakukan 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()); }
Perbedaan dengan RSA-SHA1 adalah Anda tidak perlu menyetel rahasia token akses dan pembuatan objek penanda 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
memanggil kembali kunci/kode 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);
}Perbedaan dengan RSA-SHA1 adalah Anda tidak perlu menyetel rahasia token akses dan pembuatan objek penanda berbeda:
RSA-SHA1 is not supported yet.
Referensi dan Contoh 3-Legged OAuth Tambahan
- Contoh OAuth di Blog Tips Google Data API
- Artikel: Menggunakan OAuth dengan Google Data API
- Contoh library klien Python
- Contoh Google App Engine library klien Python
- Contoh library klien Java
- Contoh Google App Engine library klien Java
- Contoh library klien Zend PHP
- Dokumentasi Autentikasi OAuth untuk Aplikasi Web
- Dokumentasi OAuth.net
OAuth 2 Legged
OAuth 2 leg memungkinkan aplikasi tepercaya mengakses Data Google pengguna tanpa keterlibatan langsung mereka. Dua grup utama dapat menggunakan OAuth dua cabang:
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 secret yang terkait dengan domain G Suite Anda, serta memberikan kontrol akses global, lihat "Mengelola kunci dan secret OAuth".
Vendor software pihak ketiga: Vendor dapat menawarkan aplikasi yang menggunakan OAuth dua kaki untuk berintegrasi dengan G Suite. Akses untuk aplikasi pihak ketiga dapat diberikan di halaman Kelola klien API atau dengan menginstal dari G Suite Marketplace.
Token akses tidak diperlukan sesuai alur otorisasi normal (juga disebut sebagai OAuth 3 cabang).
Contoh library klien berikut menunjukkan cara menyiapkan klien untuk menggunakan OAuth 2 Legged 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 Contoh OAuth 2-Legged Tambahan
- Contoh OAuth 2-legged di Blog Tips Google Data API
- Contoh OAuth 2-Legged library klien Java
- Library klien Python TwoLeggedOAuthExample (untuk class client.py) atau 2_legged_oauth sample (untuk class service.py)
- Contoh OAuth 2-Legged library klien .NET
- Dokumentasi OAuth 2 leg
Membuat kunci pribadi penandatanganan sendiri dan sertifikat publik
Kunci pribadi digunakan untuk membuat tanda tangan, yang harus disertakan dengan 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 berformat PEM. Sertifikat harus dikirim 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 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 untuk menghapus parameter ini demi keamanan tambahan.
Parameter -sha1 menentukan bahwa kunci 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 Anda buat:
openssl pkcs8 -in myrsakey.pem -topk8 -nocrypt -out myrsakey.pk8
Atau, Anda dapat menggunakan penyimpanan kunci Java dan utilitas keytool untuk membuat pasangan 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