Итак, как получать токен (ключ) для авторизации в сервисах Яндекс с помощью логина и пароля пользователя мы уже знаем. Теперь рассмотрим второй способ получения такого же токена, но только с использованием подтверждающего кода.
Использование подтверждающего кода очень сильно напоминает процесс авторизации в 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 и др.
|
[…] This post was mentioned on Twitter by Королевство Delphi, Vlad. Vlad said: Авторизация в сервисах Яндекс. Используем подтверждающий код. | Delphi в Internet http://bit.ly/eMxgVJ […]
http://en.wikipedia.org/wiki/Digest_access_authentication не могли бы вы описать данный путь. Не могу разобраться, заранее спасибо.
работает спасибо
ничего что у вас в примере есть некий edit4 который мы не создали?
а еще params не имеет метода LoadFromStream
Ничего. А с каких пор params:TStringStream не имеет метода LoadFromStream ? Вы точно в Delphi работаете?
увы, это чистая правда… Ругается delphi 7… TStringStream не имеет метода LoadFromStream. Пичалька…