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

Как я недавно говорил, в настоящее время Яндекс предоставляет разработчикам доступ к некоторым своим сервисам через API. Для авторизации используется OAuth 2.0. При этом разработчики Яндекс постарались предусмотреть все возможные варианты авторизации (с мобильного, веб- или настольного приложения) и, ем самым, позволить как можно большему количеству сторонних разработчиков получить доступ к сервисам и использовать их работу в своих программах.

Естественно, для нас, как разработчиков в Delphi, наибольший интерес представляет OAuth-авторизация для настольных приложений. Сегодня рассмотрим один из возможных вариантов получения токена для использования его в работе с сервисами Яндекса.

Способ, который мы будем использовать отдаленно напоминает Base-авторизацию, т.е. получение доступа по логину и паролю пользователя. Только в нашем случае мы получим не доступ, а токен (ключ) для доступа к ресурсам API.

Вначале зарегистрируем новое приложение Яндекс. Для этого переходим по ссылке и заполняем поля формы следующим образом:

  • НазваниеClient1
  • Ссылка на иконкуоставляем поле пустым
  • Ссылка на приложениеоставляем поле пустым
  • Callback URIоставляем поле пустым
  • Клиент для разработкиставим галочку

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

Жмем кнопку “Создать” и Яндекс выдаст нам параметры нашего приложения. Сейчас для нас ВАЖНО запомнить значение Id клиента – копируем это значение куда-нибудь, открываем Delphi и создаем новое приложение.

Для работы с HTTP, как обычно, используем Synapse. Подключаем в uses два модуля:

  • httpsend – для отправки запросов
  • ssl_openssl – для эмуляции работы с HTTPS.

Почему “эмуляции”? Для ответа на этот вопрос достаточно заглянуть в секцию инициализации модуля ssl_openssl или прочитать мое небольшое объяснение в статье “Отправка писем с GMail с использованием Synapse.”.

Теперь кидаем на главную форму кнопку и 3 Edit’а. В Edit1 будем хранить ID клиента, в Edit2 и Edit3 – логин и пароль пользователя, а в обработчике OnClick пишем:

procedure TForm4.Button1Click(Sender: TObject);
const cParams = 'grant_type=password&client_id=%s&username=%s&password=%s';
var HTTP: THTTPSend;
    Params:TStringStream;
begin
  {Заполняем параметры запроса}
  Params:=TStringStream.Create;
  HTTP:=THTTPSend.Create;
try
  Params.WriteString(Format(cParams,[Edit1.Text,Edit2.Text,Edit3.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;
end;

Как видите, все достаточно просто. заполняем параметры POST-запроса, отправляем запрос на известый URL и получаем ответ, который выглядит следующим образом:

ya_oauth

Ответ приходит в виде JSON-объекта, разобрать который не составит труда даже без использования библиотек типа SuperObject. В случае, если логин или пароль были введены некорректно, ответ может выглядеть так:

ya_oauth2

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

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

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

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

Александр
Александр
10/06/2011 11:06

Сделал все также, «Ошибка авторизации». HttpMethod возвращает 500. Не пойму в чем дело….

Андрей
Андрей
03/07/2011 20:57

Та же проблема. Может Яндекс поменял чего?Хелп…помогите!

Сергей
Сергей
01/12/2011 15:39

Ругается на строчки:

Params:=TStringStream.Create;
[Pascal Error] Unit1.pas(38): E2035 Not enough actual parameters

и

Params.LoadFromStream(HTTP.Document); 
[Pascal Error] Unit1.pas(46): E2003 Undeclared identifier: ‘LoadFromStream’ 

помогите! нужно просто автоматически авторизовываться в яндексе пока программа висит в фоне, а дальше она сама делает все действия.

Сергей
Сергей
01/12/2011 20:27

да на работе нашёл в сетке какую-то portable turbo delphi 10 вроде… но что-то я в ней даже Indy не нашёл…
в общем ща качаю дома delphi7… Но если советуете 2009, то ща качну 2009… 

Сергей
Сергей
01/12/2011 21:05

ой, сорри… нафлудил…
не заметил надпись внизу » Внимание: Все комментарии модерируются, и это может вызвать задержку их публикации. Отправлять комментарий заново не требуется»

думал не отправилось..)) 

Сергей
Сергей
01/12/2011 23:42

Поставил D2009 — сделал всё по описанию, создав отдельный новый проект, форму, кинул 3 edit’a и кнопку — прога компильнулась (хотя и с сотней предупреждений типа [DCC Warning] httpsend.pas(696): W1057 Implicit string cast from ‘AnsiString’ to ‘string’), ввёл id, логин и пароль, но получил ошибку авторизации. Может действительно Яндекс что-то изменил — я в его коде страницы так и не понял как передаётся логин и пароль… 
в общем — не фурычит… жаль… копаю гугл дальше…
нашёл такой вариант: http://janych.selfip.com/Examples/Delphi/Indy/HTTP/ интересно сработает ли… 

skuwakin
skuwakin
22/08/2014 15:19

Доброго времени суток. Что-то я уже опух… Не получается в D7 получить токен… Мне был бы очень удобен именно способ без кода подтверждения. но он не работает… На синапсе получаю код возврата false и — «ошибка авторизации».на indy 400 bad request. на webbrowser пустую страницу. Сначала грешил на https, пособирав инфу с инета, и на indy мне удается нормально авторизовыввать по логин с паролем. Еще обратил внимание, когда создаётся приложение в яндексе, и не заполняя поля callback url, ставишь галочку на «клиент для разработки» то поле callbback автоматичекски ззаполняется.правда серым цветом…что это значит я пока не понял. может забить на… Подробнее »

skuwakin
skuwakin
31/08/2014 02:32

Доброго времени суток. Поставил последние indy и вопрос токеном вроде как решился. Но теперь всплыла следующая непонятка. Допустим, что я содал приложение под юзером вася. и если я хочу узнаать (для начала), объем яндекс диска, то все прекрасно, я авторизуюсь под васей, использую полученный токен, и узнаю объем диска. А теперь я хочу узнать объем диска юзера федя, его пароль я знаю. Логинюсь под федей, и используя ранее полученный токен, аналогичным образом узнаю объем диска, и он оказывается рвным диску васи, то есть того юзера, из под которого я создал тестовое приложение. Подскажите плиз, как же это осуществить правильно…