Google Veri Protokolü İstemci Kitaplıklarında ClientLogin

Uyarı: Bu sayfa, Google'ın eski API'leri olan Google Veri API'leri hakkındadır. Yalnızca Google Veri API'leri dizininde listelenen API'ler için geçerlidir. Bu API'lerin çoğu daha yeni API'lerle değiştirilmiştir. Belirli bir yeni API hakkında bilgi edinmek için yeni API'nin belgelerine bakın. Daha yeni bir API ile istekleri yetkilendirme hakkında bilgi edinmek için Google Hesapları Kimlik Doğrulama ve Yetkilendirme başlıklı makaleyi inceleyin.

Önemli: Yeni uygulamalar için ClientLogin'i kullanmayın. Bunun yerine daha güvenli olan OAuth kimlik doğrulama protokolünü kullanın. ClientLogin, kullanımdan kaldırılmış bir kimlik doğrulama protokolüdür ve 20 Nisan 2015'te kapatılacaktır. Bu tarihten itibaren ClientLogin istekleri yanıtlanmayacak. ClientLogin kullanan mevcut uygulamalarınız varsa OAuth'a geçmenizi öneririz. Bu kitaplıktaki ClientLogin desteği, bir sonraki ana sürümde kaldırılacaktır.

Bu belgede, Google Veri API'si istemci kitaplıklarının her birinde Google'ın Yüklü Uygulamalar İçin Kimlik Doğrulama özelliğinin nasıl kullanılacağı açıklanmaktadır.

Kullanıcının özel verilerine (Google veya G Suite Hesabı ile korunur) erişmesi gereken yüklü uygulamalar, kullanıcıların kimliğini doğrulamak için programatik bir yöntem olarak ClientLogin'i kullanabilir. "Yüklü uygulama", web uygulamalarının aksine masaüstü bilgisayar veya cep telefonu gibi bir cihaza yüklenen uygulamadır.

Web uygulaması mı geliştiriyorsunuz?

Web uygulamalarının kimlik doğrulama yöntemi olarak ClientLogin'i kullanması önerilmez. Bunun yerine, lütfen Google Veri API'si İstemci Kitaplıkları ile AuthSub'ı Kullanma başlıklı makaleyi inceleyin.

Kitle

Bu belge, Google Data API'leri istemci kitaplıklarını kullanarak bir Google Veri hizmetine erişen uygulamalar yazmak isteyen geliştiriciler içindir. Bu belgede, ClientLogin arayüzü hakkında bilgi sahibi olduğunuz varsayılmaktadır. ClientLogin protokolünün tam açıklaması için Yüklü Uygulamalar İçin Kimlik Doğrulama başlıklı makaleyi inceleyin.

Google Data API istemci kitaplıkları, uygulamalarınızda ClientLogin'i kullanmanıza yardımcı olacak yöntemler sunar. Özellikle kimlik doğrulama jetonu edinme, CAPTCHA zorluklarını ele alma, kimlik doğrulama jetonunu daha sonra kullanmak üzere geri çağırma ve her istekle birlikte doğru Authorization üstbilgisini gönderme yöntemleri vardır.

İstemci kitaplıkları olmadan ClientLogin ve Google Data API'lerini kullanma

İstemci kitaplıkları, uygulamalarınızda ClientLogin'i kullanmanın tek yolu değildir. Bilmeniz gereken her şeyi ClientLogin dokümanı olan Authentication for Installed Applications (Yüklü Uygulamalar İçin Kimlik Doğrulama) bölümünde bulabilirsiniz. Ancak istemci kitaplıkları, Google Verileri uygulamanızda ClientLogin'i kullanmak için yararlı yöntemler sunar.

ClientLogin ve Google Data API'leriyle çalışma: istemci kitaplığı örnekleri

Bu bölümde, Google Veri API'leri istemci kitaplıklarını kullanarak ClientLogin dokümanlarının "ClientLogin Arayüzü" bölümünde açıklanan adımları uygulama örnekleri verilmektedir.

Bu belgedeki örneklerde Google Takvim ile etkileşim gösterilmektedir (örnekleri takip etmek için Takvim Verileri API'si hakkında bilgi sahibi olmanız gerekmez).

Yetkilendirme jetonu alma

ClientLogin'i kullanmak için uygulamanız, ClientLogin'in işleyicisine bir HTTPS POST yapmalıdır https://www.google.com/accounts/ClientLogin. POST gövdesi, varsayılan kodlama application/x-www-form-urlencoded ile bir form gönderisi olarak yapılandırılmalıdır. İstemci kitaplıklarından birini kullanarak bu isteği tek bir kod satırıyla yapabilirsiniz.

Aşağıdaki örneklerde önce Calendar Data API'ye bağlanan bir hizmet nesnesi ayarlanır, ardından ClientLogin işleyicisine bir HTTP POST yapılır.

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

GDClient'e dayalı daha yeni v2.0+ sınıflarını kullanıyorsanız:

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

v2.0 ve sonraki sürümlerde olduğu gibi, kullanıcılarınız G Suite hesabı kullanacaksa uygun ClientLogin hesap türünü belirtebilirsiniz:

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

GDClient'e dayalı daha yeni v2.0+ sınıflarını kullanıyorsanız:

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

GDataService'e dayalı eski v1.0 sınıflarını kullanıyorsanız süreç biraz farklıdır.

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

CAPTCHA'lar hakkında daha fazla bilgi için "Yüklü Uygulamalar İçin Kimlik Doğrulama" dokümanının ClientLogin Yanıtı bölümüne bakın.

Ek Kaynaklar ve Örnekler

Başa dön