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.
Penting: Jangan gunakan ClientLogin untuk aplikasi baru. Sebagai gantinya, gunakan protokol autentikasi OAuth yang lebih aman. ClientLogin adalah protokol autentikasi yang tidak digunakan lagi dan akan dinonaktifkan pada tanggal 20 April 2015. Pada saat itu, permintaan ClientLogin tidak akan dijawab lagi. Jika Anda sudah memiliki aplikasi yang menggunakan ClientLogin, sebaiknya lakukan migrasi ke OAuth. Dukungan ClientLogin di library ini akan dihapus pada rilis utama berikutnya.
Dokumen ini menjelaskan cara menggunakan Authentication untuk Aplikasi Terinstal Google dalam setiap library klien Google Data API.
Aplikasi terinstal yang memerlukan akses ke data pribadi pengguna (dilindungi oleh akun Google atau G Suite), dapat menggunakan ClientLogin sebagai cara terprogram untuk mengautentikasi pengguna. "Aplikasi terinstal" adalah aplikasi yang diinstal di perangkat, seperti komputer desktop atau ponsel, bukan aplikasi web.
Mem-build aplikasi web?
Aplikasi web tidak disarankan untuk menggunakan ClientLogin sebagai metode autentikasi. Sebagai gantinya, lihat Menggunakan AuthSub dengan Library Klien Google Data API.
Audiens
Dokumen ini ditujukan untuk developer yang ingin menulis aplikasi yang mengakses layanan Data Google menggunakan library klien Google Data API. Dokumen ini mengasumsikan bahwa Anda telah memahami antarmuka ClientLogin. Untuk deskripsi lengkap mengenai protokol ClientLogin, lihat Authentication untuk Aplikasi yang Terinstal.
Library klien Google Data API menyediakan metode untuk membantu Anda menggunakan ClientLogin di aplikasi Anda. Secara khusus, ada metode untuk mendapatkan token autentikasi, menangani tantangan CAPTCHA, menarik kembali token autentikasi untuk digunakan nanti, dan mengirimkan header Authorization
yang benar dengan setiap permintaan.
Menggunakan ClientLogin dan Google Data API tanpa library klien
Library klien bukanlah satu-satunya cara untuk menggunakan ClientLogin di aplikasi Anda. Semua yang perlu Anda ketahui dapat ditemukan di dokumentasi ClientLogin, Authentication untuk Aplikasi Terinstal. Namun, library klien menyediakan metode yang berguna untuk menggunakan ClientLogin di aplikasi Data Google Anda.
Menggunakan ClientLogin dan Google Data API: contoh library klien
Bagian ini memberikan contoh penggunaan library klien Google Data API untuk mengikuti langkah-langkah yang diuraikan di bagian "Antarmuka ClientLogin" dalam dokumentasi ClientLogin.
Contoh-contoh di seluruh dokumen ini menunjukkan interaksi dengan Google Kalender (meskipun Anda tidak perlu mengetahui apa pun tentang Calendar Data API untuk mengikuti contoh-contoh tersebut).
Memperoleh token autentikasi
Untuk menggunakan ClientLogin, aplikasi Anda harus membuat POST
HTTPS ke pengendali ClientLogin pengendali https://www.google.com/accounts/ClientLogin
. Isi POST
harus terstruktur
sebagai postingan formulir dengan encoding default application/x-www-form-urlencoded
. Dengan menggunakan salah satu library klien, Anda
dapat membuat permintaan ini dalam satu baris kode.
Contoh berikut pertama-tama menyiapkan objek layanan yang terhubung ke Calendar Data API, lalu membuat HTTP POST
ke pengendali ClientLogin.
Java
import com.google.gdata.client.*; import com.google.gdata.client.calendar.*; CalendarService client = new CalendarService("yourCompany-yourAppName-v1"); client.setUserCredentials("user@example.com", "pa$$word");
If you know your users will be using a G Suite account (as opposed to a Google/Gmail Account), you can streamline the login process by specifying the appropriate ClientLogin account type:
import com.google.gdata.client.*; import com.google.gdata.client.calendar.*; CalendarService client = new CalendarService("yourCompany-yourAppName-v1"); client.setUserCredentials("user@example.com", "pa$$word", ClientLoginAccountType.HOSTED);
.NET
using Google.GData.Client; using Google.GData.Calendar; CalendarService client = new CalendarService("yourCompany-yourAppName-v1"); client.setUserCredentials("user@example.com", "pa$$word"); client.QueryAuthenticationToken(); // Authenticate the user immediately
If you know your users will be using a G Suite account (as opposed to a Google/Gmail Account), you can streamline the login process by specifying the appropriate ClientLogin account type:
using Google.GData.Client; using Google.GData.Calendar; GDataGAuthRequestFactory authFactory = new GDataGAuthRequestFactory("cl", "yourCompany-yourAppName-v1"); authFactory.AccountType = "HOSTED"; CalendarService client = new CalendarService(authFactory.ApplicationName); client.RequestFactory = authFactory; client.setUserCredentials("user@example.com", "pa$$word"); client.QueryAuthenticationToken(); // Authenticate the user immediately
PHP
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_ClientLogin'); Zend_Loader::loadClass('Zend_Gdata_Calendar'); $serviceName = Zend_Gdata_Calendar::AUTH_SERVICE_NAME; // predefined service name ('cl') for calendar $applicationName = 'yourCompany-yourAppName-v1'; // Create an authenticated HTTP client $httpClient = Zend_Gdata_ClientLogin::getHttpClient('user@example.com', 'pa$$word', $serviceName, null, $applicationName); $client = new Zend_Gdata_Calendar($httpClient, $applicationName); // Create an instance of the Calendar service
If you know your users will be using a G Suite account (as opposed to a Google/Gmail Account), you can streamline the login process by specifying the appropriate ClientLogin account type:
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_ClientLogin'); Zend_Loader::loadClass('Zend_Gdata_Calendar'); $serviceName = Zend_Gdata_Calendar::AUTH_SERVICE_NAME; $applicationName = 'yourCompany-yourAppName-v1'; $accountType = 'HOSTED'; $httpClient = Zend_Gdata_ClientLogin::getHttpClient( 'user@example.com', 'pa$$word', $serviceName, null, $applicationName, null, null, null, $accountType); $client = new Zend_Gdata_Calendar($httpClient, $applicationName);
Python
Jika Anda menggunakan class v2.0+ yang lebih baru berdasarkan GDClient, gunakan:
import gdata.calendar.client email = 'user@example.com' password = 'pa$$word' application_name = 'yourCompany-yourAppName-v1' client = gdata.calendar.client.CalendarClient() auth_token = client.ClientLogin(email, password, application_name, service='cl')
If you know your users will be using a G Suite account (as opposed to a Google/Gmail Account), you can streamline the login process by specifying the appropriate ClientLogin account type:
auth_token = client.ClientLogin(email, password, application_name, account_type='HOSTED', service='cl')
Alternatively, if you're using the older v1.0 classes based off of GDataService, the calls are a bit different:
import gdata.calendar.service email = 'user@example.com' password = 'pa$$word' application_name = 'yourCompany-yourAppName-v1' client = gdata.calendar.service.CalendarService() client.ClientLogin(email, password, source=application_name) # OR, you can use ProgrammaticLogin() client = gdata.calendar.service.CalendarService(email=email, password=password, source=application_name) client.ProgrammaticLogin()
Seperti pada v2.0+, jika pengguna akan menggunakan akun G Suite, Anda dapat menentukan jenis akun ClientLogin yang sesuai:
import gdata.calendar.service client = gdata.calendar.service.CalendarService() client.ClientLogin('user@example.com', 'pa$$word', account_type='HOSTED', source='yourCompany-yourAppName-v1')
See the request parameters section for a
detailed explanation of each ClientLogin parameter. A complete list of available service
names is available in the FAQ.
Note: By default, the client libraries set an account-type parameter to
HOSTED_OR_GOOGLE
. That means ClientLogin will first try to authenticate the user's credentials as a G Suite account. If that fails,
it will try to authenticate as a Google Account. This becomes tricky if user@example.com
is both a Google Account and a G Suite account.
In that special case, set the account type to GOOGLE
if the user wishes to use the Google Accounts version of user@example.com
.
Once the login information has been successfully authenticated, Google returns a token, which your application will reference each time
it requests access to the user's account, such as to GET
or POST
data. The token remains valid for a set length of time,
defined by whichever Google service you're working with. Typically, tokens remain valid for 2 weeks.
Recalling an auth token
After your application has authenticated the user once, there's no need for them to input their credentials again.
We recommend storing the Auth token in your database and recalling it as necessary. That will save the overhead of an additional
HTTPS POST
and a possible CAPTCHA challenge.
The libraries provide getters/setters for accessing the token:
Java
String token = '12345abcde'; // TODO: Read user's token from your database client.setUserToken(token); UserToken auth_token = (UserToken) client.getAuthTokenFactory().getAuthToken(); token = auth_token.getValue(); // token is '12345abcde'
.NET
String token = '12345abcde'; // TODO: Read user's token from your database client.SetAuthenticationToken(token); GDataGAuthRequestFactory requestFactory = (GDataGAuthRequestFactory) client.RequestFactory; token = requestFactory.GAuthToken; // token is '12345abcde'
PHP
$token = '12345abcde'; // TODO: Read user's token from your database $client->getHttpClient()->setClientLoginToken($token); $token = $client->getHttpClient()->getClientLoginToken(); // $token is '12345abcde'
Python
If you're using the newer v2.0+ classes based off of GDClient, use:
import gdata.gauth token = '12345abcde' # TODO: Read user's token from your database client.auth_token = gdata.gauth.ClientLoginToken(token) token = client.auth_token.token_string # token is '12345abcde'
If you're using the older v1.0 classes based off of GDataService, the process is a bit different.
token = '12345abcde' # TODO: Read user's token from your database client.SetClientLoginToken(token) token = client.GetClientLoginToken() # token is '12345abcde'
Handling CAPTCHA challenges
A failure response from ClientLogin contains an error code and a URL to an error page that can be displayed to the user. If the error code is a CAPTCHA challenge, the response also includes a URL to a CAPTCHA image and a special token. Your application should be able to solicit an answer from the user and then retry the login request.
Java
String email = "user@example.com"; String password = "pa$$word"; try { client.setUserCredentials(email, password); } catch (CaptchaRequiredException e) { System.out.println("Please visit " + e.getCaptchaUrl()); System.out.print("Answer to the challenge? "); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String answer = in.readLine(); service.setUserCredentials(email, password, e.getCaptchaToken(), answer); } catch (AuthenticationException e) { System.out.println(e.getMessage()); }
.NET
try { client.setUserCredentials("user@example.com", "pa$$word"); client.QueryAuthenticationToken(); // Authenticate the user immediately } catch (CaptchaRequiredException e) { Console.WriteLine("Please visit " + e.Url); Console.Write("Answer to the challenge? "); String answer = Console.ReadLine(); GDataGAuthRequestFactory requestFactory = (GDataGAuthRequestFactory) client.RequestFactory; requestFactory.CaptchaAnswer = answer; requestFactory.CaptchaToken = e.Token; client.QueryAuthenticationToken(); // authenticate the user again } catch (InvalidCredentialsException e) { Console.WriteLine(e.Message); } catch (AuthenticationException e) { Console.WriteLine(e.Message); }
PHP
$email = 'user@example.com'; $password = 'pa$$word'; $serviceName = 'cl'; // 'cl' is the service name for the Calendar API $appName = 'yourCompany-yourAppName-v1'; try { $httpClient = Zend_Gdata_ClientLogin::getHttpClient($email, $password, $serviceName, null, $appName); } catch (Zend_Gdata_App_CaptchaRequiredException $e) { echo '<a href="' . $e->getCaptchaUrl() . '">CAPTCHA answer required to login</a>'; $answer = 'Your answer to the challenge'; $httpClient = Zend_Gdata_ClientLogin::getHttpClient( $email, $password, $serviceName, null, $appName, $e->getCaptchaToken(), $answer); } catch (Zend_Gdata_App_AuthException $e) { echo 'Error: ' . $e->getMessage(); if ($e->getResponse() != null) { echo 'Body: ' . $e->getResponse()->getBody(); } }
Python
Jika Anda menggunakan class v2.0+ yang lebih baru berdasarkan GDClient, gunakan:
import gdata.client try: client.ClientLogin(email, password, application_name, service='cl') except gdata.client.CaptchaChallenge as challenge: print 'Please visit ' + challenge.captcha_url answer = raw_input('Answer to the challenge? ') client.ClientLogin(email, password, application_name, captcha_token=challenge.captcha_token, captcha_response=answer) except gdata.client.BadAuthentication: exit('Users credentials were unrecognized') except gdata.client.RequestError: exit('Login Error')
Jika Anda menggunakan class v1.0 yang lebih lama berdasarkan GDataService, prosesnya akan sedikit berbeda.
import gdata.service email = 'user@example.com' password = 'pa$$word' application_name = 'yourCompany-yourAppName-v1' try: client.ClientLogin(email, password, source=application_name) except gdata.service.CaptchaRequired: print 'Please visit ' + client.captcha_url answer = raw_input('Answer to the challenge? ') client.ClientLogin(email, password, source=application_name, captcha_token=client.captcha_token, captcha_response=answer) except gdata.service.BadAuthentication: exit('Users credentials were unrecognized') except gdata.service.Error: exit('Login Error')
Untuk mengetahui informasi selengkapnya tentang CAPTCHA, lihat bagian Respons ClientLogin dalam dokumentasi "Authentication untuk Aplikasi yang Terinstal".
Referensi dan Contoh Tambahan
- Contoh ClientLogin di Blog Tips Google Data API
- Authentication untuk Aplikasi Terinstal