Ostrzeżenie: ta strona dotyczy starszych interfejsów API Google, czyli interfejsów Google Data API. Jest ona istotna tylko w przypadku interfejsów API wymienionych w katalogu interfejsów Google Data API, z których wiele zostało zastąpionych nowszymi interfejsami API. Informacje o konkretnym nowym interfejsie API znajdziesz w jego dokumentacji. Informacje o autoryzowaniu żądań za pomocą nowszego interfejsu API znajdziesz w artykule Uwierzytelnianie i autoryzacja kont Google.
Ważne: nie używaj ClientLogin w przypadku nowych aplikacji. Zamiast tego używaj bezpieczniejszego protokołu uwierzytelniania OAuth. ClientLogin to wycofany protokół uwierzytelniania, który zostanie wyłączony 20 kwietnia 2015 r. Po tym czasie żądania ClientLogin nie będą już obsługiwane. Jeśli masz aplikacje, które korzystają z ClientLogin, zachęcamy do przejścia na OAuth. Obsługa ClientLogin w tej bibliotece zostanie usunięta w kolejnej głównej wersji.
W tym dokumencie opisujemy, jak używać uwierzytelniania w przypadku aplikacji zainstalowanych w każdej z bibliotek klienta Google Data API.
Zainstalowane aplikacje, które potrzebują dostępu do prywatnych danych użytkownika (chronionych przez konto Google lub G Suite), mogą używać ClientLogin jako programowego sposobu uwierzytelniania użytkowników. „Zainstalowana aplikacja” to aplikacja zainstalowana na urządzeniu, np. komputerze stacjonarnym lub telefonie komórkowym, w przeciwieństwie do aplikacji internetowej.
Tworzysz aplikację internetową?
Nie zalecamy używania przez aplikacje internetowe ClientLogin jako metody uwierzytelniania. Zamiast tego zapoznaj się z artykułem Korzystanie z AuthSub w bibliotekach klienta interfejsu Google Data API.
Odbiorcy
Ten dokument jest przeznaczony dla deweloperów, którzy chcą tworzyć aplikacje uzyskujące dostęp do usługi Google Data za pomocą bibliotek klienta interfejsów Google Data API. Zakładamy, że znasz interfejs ClientLogin. Pełny opis protokołu ClientLogin znajdziesz w artykule Uwierzytelnianie w przypadku zainstalowanych aplikacji.
Biblioteki klienta interfejsu Google Data API udostępniają metody, które pomagają korzystać z ClientLogin w aplikacjach. W szczególności istnieją metody uzyskiwania tokena uwierzytelniania, obsługiwania wyzwań CAPTCHA, przywoływania tokena uwierzytelniania do późniejszego użycia i wysyłania prawidłowego nagłówka Authorization z każdym żądaniem.
Korzystanie z ClientLogin i interfejsów API danych Google bez bibliotek klienta
Biblioteki klienta nie są jedynym sposobem używania ClientLogin w aplikacjach. Wszystkie potrzebne informacje znajdziesz w dokumentacji ClientLogin, w artykule Uwierzytelnianie w przypadku zainstalowanych aplikacji. Biblioteki klienta udostępniają jednak przydatne metody wykorzystywania ClientLogin w aplikacji Google Data.
Praca z ClientLogin i interfejsami Google Data API: przykłady bibliotek klienta
W tej sekcji znajdziesz przykłady użycia bibliotek klienta interfejsów Google Data API do wykonania czynności opisanych w sekcji „Interfejs ClientLogin” w dokumentacji ClientLogin.
Przykłady w tym dokumencie pokazują interakcje z Kalendarzem Google (chociaż nie musisz znać interfejsu Calendar Data API, aby z nich korzystać).
Uzyskiwanie tokena uwierzytelnienia
Aby używać ClientLogin, aplikacja powinna wysyłać żądania HTTPS POST do modułu obsługi ClientLoginhttps://www.google.com/accounts/ClientLogin. POST treść powinna być ustrukturyzowana jako post w formularzu z domyślnym kodowaniem application/x-www-form-urlencoded. Korzystając z jednej z bibliotek klienta, możesz wysłać to żądanie za pomocą jednego wiersza kodu.
W przykładach poniżej najpierw konfiguruje się obiekt usługi łączący się z interfejsem Calendar Data API, a potem wysyła żądanie HTTP POST do modułu obsługi 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
Jeśli używasz nowszych klas w wersji 2.0 lub nowszej opartych na klasie GDClient, użyj:
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()
Podobnie jak w przypadku wersji 2.0 lub nowszej, jeśli użytkownicy będą korzystać z konta G Suite, możesz określić odpowiedni typ konta ClientLogin:
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
Jeśli używasz nowszych klas w wersji 2.0 lub nowszej opartych na klasie GDClient, użyj:
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')
Jeśli używasz starszych klas w wersji 1.0 opartych na GDataService, proces jest nieco inny.
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')
Więcej informacji o CAPTCHA znajdziesz w sekcji „Odpowiedź ClientLogin” w dokumentacji „Uwierzytelnianie w przypadku zainstalowanych aplikacji”.
Dodatkowe materiały i przykłady
- Przykłady ClientLogin na blogu z wskazówkami dotyczącymi interfejsu Google Data API
- Uwierzytelnianie zainstalowanych aplikacji