Как я недавно говорил, в настоящее время Яндекс предоставляет разработчикам доступ к некоторым своим сервисам через 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 и получаем ответ, который выглядит следующим образом:
Ответ приходит в виде JSON-объекта, разобрать который не составит труда даже без использования библиотек типа SuperObject. В случае, если логин или пароль были введены некорректно, ответ может выглядеть так:
В заключении следует сказать, что предложенный выше способ получение токена является нежелательным и использовать его стоит только в крайнем случае, когда другие методы (а их ещё как минимум два для настольных приложений) не могут быть реализованы. Второй способ авторизации рассмотрим немного позднее.
Книжная полка
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
|
||
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
|
[…] This post was mentioned on Twitter by Королевство Delphi, Vlad. Vlad said: Авторизация в сервисах Яндекс. Используем логин и пароль. | Delphi в Internet http://bit.ly/fWczn5 […]
Сделал все также, «Ошибка авторизации». HttpMethod возвращает 500. Не пойму в чем дело….
Та же проблема. Может Яндекс поменял чего?Хелп…помогите!
Ругается на строчки:
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’
помогите! нужно просто автоматически авторизовываться в яндексе пока программа висит в фоне, а дальше она сама делает все действия.
Сергей, версия Delphi какая? 7-ка? Смените хотя бы на 2009 и всё заработает
да на работе нашёл в сетке какую-то portable turbo delphi 10 вроде… но что-то я в ней даже Indy не нашёл…
в общем ща качаю дома delphi7… Но если советуете 2009, то ща качну 2009…
Сергей, я так посоветовал, потому что как раз в D7 код
Params:=TStringStream.Create;
не создался бы, т.к. в D7 надо было делать так:
Params:=TStringStream.Create(' ');
ой, сорри… нафлудил…
не заметил надпись внизу » Внимание: Все комментарии модерируются, и это может вызвать задержку их публикации. Отправлять комментарий заново не требуется»
думал не отправилось..))
Поставил 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/ интересно сработает ли…
Доброго времени суток. Что-то я уже опух… Не получается в D7 получить токен… Мне был бы очень удобен именно способ без кода подтверждения. но он не работает… На синапсе получаю код возврата false и — «ошибка авторизации».на indy 400 bad request. на webbrowser пустую страницу. Сначала грешил на https, пособирав инфу с инета, и на indy мне удается нормально авторизовыввать по логин с паролем. Еще обратил внимание, когда создаётся приложение в яндексе, и не заполняя поля callback url, ставишь галочку на «клиент для разработки» то поле callbback автоматичекски ззаполняется.правда серым цветом…что это значит я пока не понял. может забить на… Подробнее »
Доброго времени суток. Поставил последние indy и вопрос токеном вроде как решился. Но теперь всплыла следующая непонятка. Допустим, что я содал приложение под юзером вася. и если я хочу узнаать (для начала), объем яндекс диска, то все прекрасно, я авторизуюсь под васей, использую полученный токен, и узнаю объем диска. А теперь я хочу узнать объем диска юзера федя, его пароль я знаю. Логинюсь под федей, и используя ранее полученный токен, аналогичным образом узнаю объем диска, и он оказывается рвным диску васи, то есть того юзера, из под которого я создал тестовое приложение. Подскажите плиз, как же это осуществить правильно…