אזהרה: המאמר הזה עוסק בממשקי API ישנים יותר של Google, ממשקי Google Data API. הוא רלוונטי רק לממשקי ה-API שמופיעים בספריית Google Data API, שרבים מהם הוחלפו בממשקי API חדשים יותר. מידע על API חדש ספציפי מופיע במסמכי התיעוד של ה-API החדש. למידע על הרשאת בקשות באמצעות API חדש יותר, אפשר לעיין במאמר אימות והרשאה של חשבונות Google.
חשוב: אל תשתמשו ב-ClientLogin באפליקציות חדשות. במקום זאת, כדאי להשתמש בפרוטוקול האימות המאובטח יותר OAuth. ClientLogin הוא פרוטוקול אימות שיצא משימוש, והוא יושבת ב-20 באפריל 2015. החל מהתאריך הזה, לא תהיה יותר תשובה לבקשות ClientLogin. אם יש לכם אפליקציות קיימות שמשתמשות ב-ClientLogin, מומלץ לעבור ל-OAuth. התמיכה ב-ClientLogin בספרייה הזו תוסר בגרסה הגדולה הבאה.
במאמר הזה מוסבר איך להשתמש באימות של Google לאפליקציות מותקנות בכל אחת מספריות הלקוח של Google Data API.
אפליקציות מותקנות שצריכות גישה לנתונים פרטיים של משתמש (שמוגנים על ידי חשבון Google או G Suite), יכולות להשתמש ב-ClientLogin כאמצעי תכנותי לאימות משתמשים. 'אפליקציה מותקנת' היא אפליקציה שמותקנת במכשיר, כמו מחשב או טלפון נייד, בניגוד לאפליקציית אינטרנט.
מפתחים אפליקציית אינטרנט?
לא מומלץ להשתמש ב-ClientLogin כשיטת אימות באפליקציות אינטרנט. במקום זאת, אפשר לעיין במאמר בנושא שימוש ב-AuthSub עם ספריות הלקוח של Google Data API.
קהל
המסמך הזה מיועד למפתחים שרוצים לכתוב אפליקציות עם גישה לשירות Google Data באמצעות ספריות הלקוח של Google Data APIs. במסמך הזה אנחנו מניחים שאתם מכירים את ממשק ClientLogin. תיאור מלא של פרוטוקול ClientLogin זמין במאמר בנושא אימות לאפליקציות מותקנות.
ספריות הלקוח של Google Data API מספקות שיטות שיעזרו לכם להשתמש ב-ClientLogin באפליקציות שלכם. באופן ספציפי, יש שיטות להשגת טוקן אימות, לטיפול באתגרי CAPTCHA, לאחזור טוקן האימות לשימוש מאוחר יותר ולשליחת הכותרת הנכונה Authorization עם כל בקשה.
שימוש ב-ClientLogin וב-Google Data APIs בלי ספריות הלקוח
ספריות הלקוח הן לא הדרך היחידה להשתמש ב-ClientLogin באפליקציות שלכם. כל מה שצריך לדעת מופיע במסמכי התיעוד של ClientLogin, אימות לאפליקציות מותקנות. עם זאת, ספריות הלקוח מספקות שיטות שימושיות לשימוש ב-ClientLogin באפליקציית Google Data.
עבודה עם ClientLogin וממשקי Google Data API: דוגמאות לספריות לקוח
בקטע הזה מופיעות דוגמאות לשימוש בספריות הלקוח של Google Data APIs כדי לבצע את השלבים שמפורטים בקטע ממשק ClientLogin במסמכי התיעוד של ClientLogin.
הדוגמאות שמופיעות לאורך המסמך הזה מדגימות אינטראקציה עם יומן Google (אבל לא צריך לדעת שום דבר על Calendar Data API כדי להבין את הדוגמאות).
קבלת טוקן אימות
כדי להשתמש ב-ClientLogin, האפליקציה צריכה לשלוח בקשת HTTPS POST אל ה-handler של ClientLogin https://www.google.com/accounts/ClientLogin. הגוף של POST צריך להיות בנוי כטופס POST עם קידוד ברירת המחדל application/x-www-form-urlencoded. באמצעות אחת מספריות הלקוח, אפשר לשלוח את הבקשה הזו בשורה אחת של קוד.
בדוגמאות הבאות, קודם מגדירים אובייקט שירות שמתחבר ל-Calendar Data API, ואז מבצעים בקשת HTTP POST למטפל 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
אם אתם משתמשים במחלקות החדשות יותר מגרסה v2.0 ומעלה שמבוססות על GDClient, אתם צריכים להשתמש ב:
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()
בדומה לגרסה 2.0 ואילך, אם המשתמשים שלכם ישתמשו בחשבון G Suite, תוכלו לציין את סוג החשבון המתאים של 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
אם אתם משתמשים במחלקות החדשות יותר מגרסה v2.0 ומעלה שמבוססות על GDClient, אתם צריכים להשתמש ב:
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')
אם אתם משתמשים במחלקות הישנות יותר מגרסה 1.0 שמבוססות על GDataService, התהליך קצת שונה.
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 זמין בקטע ClientLogin Response במסמך בנושא 'אימות לאפליקציות מותקנות'.
מקורות מידע נוספים ודוגמאות
- דוגמאות ל-ClientLogin בבלוג בנושא טיפים ל-Google Data API
- אימות לאפליקציות מותקנות