уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

В одном из постов в блоге я рассказывал про новый класс в проекте «Google API в Delphi» для авторизации в API по протоколу OAuth 2.0.

По большому счёту модуль для OAuth создавался для того, чтобы использовать его в API, которые не поддерживают ClientLogin (в основном это новые API из Лаборатории). Но после известных событий в самом Google (см. «18 API Google псу под хвост…«) этот модуль как-то затерялся, забылся т.к. тратить время над API, которые в любой момент могут быть объявлены несостоявшимися как-то не хотелось. Сегодня я решил снова вернуться к теме использования OAuth в Google и написать небольшой компонент Delphi, которые, наряду с уже имеющимися компонентом GoogleLogin позволит авторизовываться в любых API Google вне зависимости от того находится ли этот API в лаборатории или это стабильная версия, например, как Google Docs API 2.0.

Чтобы не повторяться дважды и не рассказывать об устройстве OAUth 2.0 для проектов гугла, советую Вам прочитать предыдущий пост на эту тему, тем более, что демка для компонента будет таже самая.


Изменения в класса TOAuth

Итак, что изменилось в модуле по сравнению с предыдущим вариантом.

1. Класс TOAuth теперь стал компонентом Delphi. Компонент TOAuth можно установить на панель Delphi. Для этого необходимо скачать пакет по ссылке, предоставленной в конце поста.

2. В компоненте, помимо основной его функции- авторизации в сервисе и получении токена, дополнительно реализованы четыре метода для выполнения основных HTTP-запросов к ресурсам API:

TOAuth = class(TComponent)
...
function GETCommand(URL: string; Params: TStrings): RawBytestring;
function POSTCommand(URL: string; Params: TStrings; Body: TStream;
      Mime: string = DefaultMime): RawBytestring;
function PUTCommand(URL: string; Body: TStream; Mime: string = DefaultMime)
      : RawBytestring;
procedure DELETECommand(URL: string);

Как понятно из названий методов они предназначены для выполнения GET-, POST-, PUT- и DELETE-запросов.

3. Чтобы не заставлять всех скачивать и устанавливать вместе с компонентом Synapse компонент был переписан под библиотеку Indy.
4. Чтобы облегчить Вам использование компонента в проектах пришлось немного потрудиться над созданием простенькой документации к компоненту. Теперь, чтобы узнать для чего нужно то или иное свойство или метод компонента достаточно навести на него курсор мышки и получить необходимое описание:

Help Insight — сила =). Конечно по этой причине в модуле появилось достаточно много «лишнего» текста, но, думаю, что это не сильно помешает пользователям компонента.

Вот, пожалуй все изменения для класса OAuth. Теперь рассмотрим небольшую демку по работе с компонентом.

Пример использования компонента

Раз уж первоначальной идеей для модуля было использование его с Google Tasks API, то и рассмотрим пример получения токена для этого API. Итак, создаем новое приложение Delphi и на главную форму приложения бросаем следующие компоненты:

  • TWebBrowser — для показа пользователю странички авторизации и получения ключа
  • 3 TButton — для загрузки Web-страницы, получения токена и его обновления
  • 2 Memo — для вывода сведений по токену и вывода обновленного значения токена.
Теперь смотрим на свойства компонента. Свойств не так уж и много:
ClientID и ClientSecret — идентификатор и секретный ключ клиента. Эти значения Вы получите при регистрации своего клиента в Google.
Scope — точка доступа. Это значение зависит от API. Например, для Tasks API первой точкой входа будет URL — https://www.googleapis.com/auth/tasks.
Можете заполнить эти свойства сразу, а можете и как я — по ходу работы программы.
Теперь расписываем события OnClick трех кнопок:
Клик по кнопке для получения кода доступа пользователем:
procedure TForm3.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate(OAuth1.AccessURL);
end;

Клик по кнопке получения токена:

procedure TForm3.Button2Click(Sender: TObject);
begin
 OAuth1.ResponseCode:=edToken.Text;//запоминаем код
 Memo2.Lines.Clear;
 Memo1.Lines.Add('Access Token = '+OAuth1.GetAccessToken);//получаем токен
 Memo1.Lines.Add('Eexpires_in = '+OAuth1.Expires_in);//время жизни токена
 Memo1.Lines.Add('Refresh Token = '+OAuth1.Refresh_token);//ключ для обновления
end;

И последний клик по кнопке обновления:

procedure TForm3.Button3Click(Sender: TObject);
begin
  Memo2.Lines.Clear;
  Memo2.Lines.Add(OAuth1.RefreshToken)
end;

В результате в запущенном приложении можно получить следующие значения:
После клика по кнопке получения кода доступа:


После получения токена:

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

Книжная полка

Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес
5 1 голос
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
6 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
ForMal
ForMal
13/09/2011 14:00

Два дня пытался скрестить unit GTaskAPI вкупе с OAuth, и при вызове ListList возвращается текст ошибки:

{
 «error»: {
  «errors»: [
   {
    «domain»: «global»,
    «reason»: «authError»,
    «message»: «Invalid Credentials»,
    «locationType»: «header»,
    «location»: «Authorization»
   }
  ],
  «code»: 401,
  «message»: «Invalid Credentials»
 }
}
Дело в том, что OAuth-ом регистрация проходит, токен получаю. Объект OAuth передаю (Task.OAuthClient := OAuth;), затем вызываю ShowMessage(Task.ListsList()); — результат — текст вышеприведенной ошибки :(

Попрошу вас Влад добавить меня в группу delphicelendar ибо есть непреодолимое желание реализовать работу GTaskAPI через ClientLogin. Спасибо.
 

 

trackback

[…] на будущее и дописать компонент для работы с Google OAuth 2.0. Всё-таки как бы ни хотелось использовать только […]

trackback

[…] дел. Для авторизации в API Google Вы можете использовать модуль для OAuth, или же, если у Вас Delphi XE5 и выше — библиотеку REST Client […]

trackback

[…] дел. Для авторизации в API Google Вы можете использовать модуль для OAuth, или же, если у Вас Delphi XE5 и выше — библиотеку REST Client […]

webserfer
webserfer
02/02/2015 21:09

Как его на 7 заставить работать?

Анонимно
Анонимно
18/12/2016 15:25
Ответить на  webserfer

никак