+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 93.25 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

Google API. Интерфейс ClientLogin для Delphi

08.02.2010 13:13

Источник: Webdelphi

Сегодня наконец-то умудрился загрузить code.google.com, что не может не радовать.  Оказывается у моего провайдера периодически происходят какие-то косяки в оборудовании и, что самое интересное, только Google глючит - остальные адреса работают…Странный глюк, но сегодня не об этом.

Сегодня я расскажу про модуль, реализующий интерфейс ClientLogin. Этот интерфейс используется в Google API для аутентификации пользователей, использующих установленные приложения. Т.е. по сути этот интерфейс - основа для работы с различными API от Google из своих приложений Delphi, например доступ к Календарю Google, Analytics и т.д.

В начале о том, что дает нам использование ClientLogin. Самое главное - это получение маркера Auth, который действует в течение некоторого промежутка времени (в зависимости от используемой службы) и на который будет ссылаться наше будущее приложение, чтобы получить доступ к управлению данными.

Интерфейс использует стандартную систему защиты - Captcha, поэтому надо будет предусмотреть её загрузку и отправку данных  ответа на сервер.

Интерфейс НЕ используется для добавления и удаления служб и сервисов в аккаунт пользователя, т.е. вы не сможете использовать Auth, например, для добавления сервиса Google Analytics в свой аккаунт, но управлять уже подключенным сервисом - сможете.

Теперь о том, как получить этот самый маркер Auth. Для этого необходимо отправить запрос методом POST на адрес https://www.google.com/accounts/ClientLogin и проанализировать ответ сервера. Как видите, нам придётся иметь дело опять с HTTPS.

Параметры запроса следующие:

accountType - тип аккаунта, для которого выполняется аутентификация. Может принимать значения:

GOOGLE (выполнить аутентификацию аккаунта Google)
HOSTED (выполнить аутентификацию размещенного аккаунта)
HOSTED_OR_GOOGLE (выполнить аутентификацию размещенного аккаунта; в случае неудачи выполнить аутентификацию аккаунта Google)

Если мы изначально не знаем с каким типом аккаунта будем иметь дело - то лучше использовать HOSTED_OR_GOOGLE.

Email - адрес электронной почты пользователя.
 

Passwd - пароль пользователя.

service - имя службы Google, к которой вы запрашиваете доступ. Каждой из служб, использующих службу аутентификации, присвоено имя. Например, с Календарем Google связано имя " cl ", с Google Analytics - " analytics " и т.д. Если изначально неизвестно имя службы, то можно использовать универсальное имя " xapi ".

source - Короткая строка, идентифицирующая ваше приложение и применяемая для ведения журнала. Эта строка должна иметь следующий формат:
" companyName-applicationName-versionID" .

logintoken - Маркер, представляющий конкретное значение CAPTCHA. Google присылает этот маркер и URL изображения CAPTCHA в ответе о неудачном входе с кодом ошибки "CaptchaRequired".

logincaptcha - Строка, указанная пользователем в качестве ответа на тест CAPTCHA.

Все перечисленные параметры должны содержаться в запросе. После отправки запроса нам придёт ответ, который может содержать:

1.    В случае успешной аутентификации - код 200 и 3 строки: SID, LSID и Auth . Первые два маркера в настоящее время зарезервированы и не используются.

2.    В случае ошибки нам возвращается код 403 и короткое сообщение (код) об ошибке

3.    В случае необходимости ввода каптчи - код ошибки "CaptchaRequired", URL Captcha и параметр logintoken.

Таким образом, от нас требуется не так уж и много - отправить запрос, проанализировать ответ и, если необходимо, получить каптчу и отправить ответ серверу.

Теперь, что касается модуля Delphi. Модуль GoogleLogin не использует в работе ни Synapse, ни Indy - только WinInet. Отправка данных на сервер осуществляется в следующей функции:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

function TGoogleLogin.SendRequest(const ParamStr: string): AnsiString;

  function DataAvailable(hRequest: pointer; out Size : cardinal): boolean;

  begin

    result := wininet.InternetQueryDataAvailable(hRequest, Size, 0, 0);

  end;

var hInternet,hConnect,hRequest : Pointer;

    dwBytesRead,I,L : Cardinal;

begin

try

  hInternet := InternetOpen(PChar('GoogleLogin'),INTERNET_OPEN_TYPE_PRECONFIG,Nil,Nil,0);

  if Assigned(hInternet) then

    begin

     //Открываем сессию

     hConnect := InternetConnect(hInternet,PChar('www.google.com'),Flags_connection,nil,nil,INTERNET_SERVICE_HTTP,0,1);

     if Assigned(hConnect) then

       begin

        //Формируем запрос

        hRequest := HttpOpenRequest(hConnect,PChar(uppercase('post')),PChar('accounts/ClientLogin?'+ParamStr),HTTP_VERSION,nil,Nil,Flags_Request,1);

        if Assigned(hRequest) then

          begin

           //Отправляем запрос

           I := 1;

           if HttpSendRequest(hRequest,nil,0,nil,0) then

             begin

               repeat

                 DataAvailable(hRequest, L);//Получаем кол-во принимаемых данных

                 if L = 0 then break;

                 SetLength(Result,L + I);

                 if InternetReadFile(hRequest,@Result[I],sizeof(L),dwBytesRead) then//Получаем данные с сервера

                 else break;

                 inc(I,dwBytesRead);

               until dwBytesRead = 0;

               Result[I] := #0;

              end;

         end;

      InternetCloseHandle(hRequest);

     end;

   InternetCloseHandle(hConnect);

  end;

 InternetCloseHandle(hInternet);

except

  InternetCloseHandle(hRequest);

  InternetCloseHandle(hConnect);

  InternetCloseHandle(hInternet);

end;

end;

На выходе имеем строку, содержащую ответ серверу. Привожу код именно этой функции, т.к. она Вам может пригодиться не только для работы с Google, но и, например, для авторизации ВКонтакте - главное передать верные параметры на вход.

В модуле определен следующий класс:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

type

TGoogleLogin = class

private

//регистрационные данные

  FAccountType  : TAccountType;

  FLastResult   : TLoginResult;

  FEmail        : string;

  FPassword     : string;

//данные ответа/запроса

  FSID          : string;//в настоящее время не используется

  FLSID         : string;//в настоящее время не используется

  FAuth         : string;

  FService      : string;//сервис к которому необходимо получить доступ

  FSource       : string;//имя вызывающего приложения

  FLogintoken   : string;

  FLogincaptcha : string;

//параметры Captcha

  FCaptchaURL    : string;

  function SendRequest(const ParamStr: string):AnsiString;

  function ExpertLoginResult(const LoginResult:string):TLoginResult;

  function GetLoginError(const str: string):TLoginResult;

  function GetCaptchaToken(const cList:TStringList):String;

  function GetCaptchaURL(const cList:TStringList):string;

  function GetResultText:string;

  procedure SetEmail(cEmail:string);

  procedure SetPassword(cPassword:string);

  procedure SetService(cService:string);

  procedure SetSource(cSource: string);

  procedure SetCaptcha(cCaptcha:string);

public

  constructor Create(const aEmail, aPassword: string);

  function Login(aLoginToken:string='';aLoginCaptcha:string=''):TLoginResult;

  procedure CloseConect;//удаляет все данные по авторизации

  property AccountType: TAccountType read FAccountType write FAccountType;

  property LastResult: TLoginResult read FLastResult;

  property LastResultText:string read GetResultText;

  property Email: string read FEmail write SetEmail;

  property Password:string read FPassword write SetPassword;

  property Service: string read FService write SetService;

  property Source: string read FSource write FSource;

  property Auth: string read FAuth;

  property SID: string read FSID;

  property LSID: string read FLSID;

  property CaptchaURL: string read FCaptchaURL;

  property LoginToken: string read FLogintoken;

  property LoginCaptcha: string read FLogincaptcha write FLogincaptcha;

end;

При работе с классом следует учитывать, что изменение в процессе работы свойств Email, Password и Source ведет к обнулению всех данных об аутентификации. То есть, если вы меняете одно из этих свойств или все сразу, то после этого надо обязательно выполнить метод Login для получения нового значения Auth.

Работа с классом элементарна, поэтому не вижу причин расписывать каждое поле, свойство и метод в отдельности, а покажу простой пример его использования. Например, можно авторизоваться так:

1

2

3

4

5

6

7

[...]

var Account: TGoogleLogin;

begin

  Account:=TGoogleLogin.Create(Edit1.Text,Edit2.Text);

  Account.Login();

  ShowMessage(Account.LastResultText);

[...]

Метод LastResultText вернет вам сообщение об успешной аутентификации, либо текст, содержащий описание ошибки. А параметры запроса будут следующими:

service=xapi

source=Noname-MyCompany-1.0

accountType=HOSTED_OR_GOOGLE

Можно изменить любые из свойств и перелогиниться. А если Google попросит ввести каптчу, то узнать об этом можно, например так:

1

2

if Account.LastResult=lrCaptchaRequired then

  ShowMessage('URL для загрузки Captcha '+Account.CaptchaURL);

и после ввода пользователем ответа, отправить новые запрос на аутентификацию таким образом:

1

2

Account.LoginCaptcha:=тут ответ пользователя;

Account.Login(Account.LoginToken,Account.LoginCaptcha);

В этом модуле я не стал реализовывать загрузку каптчи т.к. по сути это действие должно выполняться в готовом приложении - надо будет не только загрузить, но и где-то показать картинку с кодом. Хотя, если потребуется в будущем, можно будет реализовать загрузку в простой TBitmap и потом из него уже выводить куда угодно. Но это пока в планах.

Сам модуль и пример работы с ним Вы можете скачать здесь.

Ссылки по теме

  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года