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

Итак, как получать токен (ключ) для авторизации в сервисах Яндекс с помощью логина и пароля пользователя мы уже знаем. Теперь рассмотрим второй способ получения такого же токена, но только с использованием подтверждающего кода.

Использование подтверждающего кода очень сильно напоминает процесс авторизации в API Twitter’а для настольных приложений. Смысл этого способа достаточно прост: на первом этапе авторизации пользователь направляется на страницу Яндекс для ввода своего логина и пароля (если он ещё на вошел в аккаунт), далее Яндекс задает простой вопрос “Дать доступ к твоим данным приложению “Икс”?”. При положительном ответе сервер перенаправляет пользователя на страницу на которой расположен код подтверждения. Второй этап – пользователь вводит код подтверждения в программу и программа уже это код отправляет снова серверу для получения токена. Если все верно – сервер возвращает токен и можно работать с ресурсами API. Рассмотрим весь процесс по пунктам.

Весь процесс авторизации в Яндекс API можно представить в виде вот такой схемы, взятой, кстати, из документации того же Яндекса:

Вначале снова регистрируем новое приложение в Яндекс. Указываем следующие параметры:

  • Название – Client1
  • Ссылка на иконку – оставляем поле пустым
  • Ссылка на приложение – оставляем поле пустым
  • Callback URI – https://oauth.yandex.ru/verification_code
  • Клиент для разработки – ставим галочку

Обратите внимание – когда мы использовали для получения токена логин и пароль пользователя, то никаких Callback URI не требовалось, а сейчас необходимо указать именно такой параметр Callback URI как показано выше.

Теперь запускаем Delphi, создаем новое приложение, на главную форму кидаем следующие компоненты:

  • 2 Button. Клик по первой кнопке запустит процесс авторизации, по второй – завершит и выдаст сообщение, содержащее токен.
  • 2 Edit для записи ID клиента и подтверждающего кода
  • 1 WebBrowser для переходов по страницам Яндекса. Можно в принципе и без него обойтись и открывать сразу страницу в браузере через тот же ShellExecute, но пусть пока у нас будет свой браузер :).

В uses подключаем модули Synapse:

  • httpsend — для отправки запросов по HTTP
  • ssl_openssl — для поддержки работы с HTTPS

Теперь начнем расписывать по шагам весь процесс авторизации.

Шаг 1. Отправляем пользователя на Яндекс

Обработчик OnClick у первой кнопки элементарный:

WebBrowser1.Navigate('https://oauth.yandex.ru/authorize?response_type=code&client_id='+Edit1.Text);

В Edit1 должен содержаться ID клиента. После выполнения этого метода пользователь увидит страницу для ввода логина и пароля от своего аккаунта (если он ещё не авторизован) или же форму подтверждения доступа к своим данным из нашего приложения.

Пользователь, самостоятельно вводит логин и пароль, дает доступ к данным нашему приложению и копирует в буфер обмена код подтверждения. Мы ждем.

Шаг 2. Получаем токен.

Пользователь вводит подтверждающий код в поле Edit2 и жмёт вторую кнопку у которой обработчик будет выглядеть чуточку посложнее. Вот так:

const cParams = 'grant_type=authorization_code&code=%s&client_id=%s';
var HTTP: THTTPSend;
    Params:TStringStream;
begin
  {Заполняем параметры запроса}
  Params:=TStringStream.Create;
  HTTP:=THTTPSend.Create;
try
  Params.WriteString(Format(cParams,[Edit4.Text,Edit1.Text]));
  {отправляем запрос и показываем ответ}
  HTTP.Document.LoadFromStream(Params);
  if HTTP.HTTPMethod('POST','https://oauth.yandex.ru/token') then
    begin
      Params.LoadFromStream(HTTP.Document);
      ShowMessage(Params.DataString)
    end
  else
    ShowMessage('Ошибка авторизации');
finally
  Params.Free;
  HTTP.Free;
end;

То есть фактически мы сделали запрос идентичный тому, который уже делали при использовании логина и пароля пользователя с одной лишь разницей, что вместо логина и пароля мы «подсунули» серверу подтверждающий код. Собственно и результат тоже будет одинаковый — JSON-объект содержащий необходимый нам токен или сообщение об ошибке. Ну, а теперь можно спокойно передавать токен в заголовках запросов и использовать все имеющиеся в нашем распоряжении ресурсы API.

Процесс авторизации, на самом деле достаточно простой. Однако, если Вы используете Delphi XE5 и новее, то для реализации этого же алгоритма Вы можете воспользоваться библиотекой RESTClient Library в которой уже реализованы необходимые алгоритмы получения токена как по коду подтверждения, так и напрямую.

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

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

[…] This post was mentioned on Twitter by Королевство Delphi, Vlad. Vlad said: Авторизация в сервисах Яндекс. Используем подтверждающий код. | Delphi в Internet http://bit.ly/eMxgVJ […]

ad
ad
10/12/2010 02:08

http://en.wikipedia.org/wiki/Digest_access_authentication не могли бы вы описать данный путь. Не могу разобраться, заранее спасибо.

Александр
23/12/2010 10:10

работает спасибо

тузик
тузик
12/07/2011 14:40

ничего что у вас в примере есть некий edit4 который мы не создали?
а еще params не имеет метода LoadFromStream 

skuwakin
skuwakin
19/08/2014 22:30
Ответить на  Vlad

увы, это чистая правда… Ругается delphi 7… TStringStream не имеет метода LoadFromStream. Пичалька…