Среда, 15.05.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Как часто ви на этот сайт заходите?
Всего ответов: 159
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Сеть-интернет » Разные

Общие принципы авторизации на удаленных сайтах

Этой темой я открою цикл ответов и объяснений самых распространенных проблем, с которыми сталкиваются программисты Delphi при написании программ, которые должны взаимодействовать с удаленными WEB сайтами.
Итак, у нас стоит задача при работе своей программы авторизоваться на неком удаленном сайте. Для простейшего примера я взял портал mail.ru
Зарегистрировал там пользователя programmers с паролем 1234
Итак, сначала немного теории: Авторизация на любом сайте происходит путем заполнения формы и отправки её данных некому удаленному крипту методом POST. На самом деле после того как вы заполнили формы и нажали на кнопку, данные отправятся в виде простой строки, содержащей все параметры и их значения разделенные разделителем.
Все формы на страницах описываются тегом <form> имеющим достаточное кол-во параметров, приведу самые нужные для нас:

Параметр method

Значение параметра method не зависит от регистра. Различают два метода — GET и POST. Существуют и другие методы, но они пока мало используются.
GET
Этот метод является одним из самых распространенных и предназначен для получения требуемой информации и передачи данных в адресной строке. Пары «имя=значение» присоединяются в этом случае к адресу после вопросительного знака и разделяются между собой амперсандом (символ &). Удобство использования метода GET заключается в том, что адрес со всеми параметрами можно использовать неоднократно, сохранив его, например, в «Избранное» браузера, а также менять значения параметров прямо в адресной строке.
POST
Метод POST посылает на сервер данные в запросе браузера. Это позволяет отправлять большее количество данных, чем доступно методу GET, поскольку у него установлено ограничение в 4 Кб. Большие объемы данных используются в форумах, почтовых службах, заполнении базы данных и т.д.

Параметр Action

Указывает обработчик, к которому обращаются данные формы при их отправке на сервер. В качестве обработчика может выступать CGI-программа или HTML-документ, который включает в себя серверные сценарии (например, Parser). После выполнения обработчиком действий по работе с данными формы он возвращает новый HTML-документ.

Если параметр action отсутствует, текущая страница перезагружается, возвращая все элементы формы к их значениям по умолчанию.
(Описания параметров предоставлены сайтом htmlbook.ru) Итак, заходим на сайт Mail.ru и смотрим исходный код страницы.
Ищем тег "<form" Разумеется, на странице может быть множество форм, но необходимая нам достаточно интуитивно понятно находится:

<form name="Auth" method="post" action="http://win.mail.ru/cgi-bin/auth"> 

Далее ищем закрывающий тег формы </form> и копируем себе в блокнот все содержимое формы для его тщательного рассмотрения.
Итак, вот мы получили форму:

<form name="Auth" method="post" action="http://w in.mail.ru/cgi-bin/auth">
<img src="/mail/ru/images/log_bms.gif" width= "226" height="18" usemap="#logbms" 
alt="" 
/><br /> 
<map name="logbms" id="logbmsid"><area shape="rect" coords="1 09,1,220,18" 
href="http://agent.mail.ru" alt="Агент"></area ><area shape="default" 
nohref="nohref" 
alt=""></area></map><table class="authoriza tion">
<tr> 
<td colspan="2" class="registration"> 
<a href="http://win.mail.ru/cgi-bin/sign up" 
class="left">Регистрация &nbsp;в&nbsp;почте</a> 
<a 
href="http://r.mail.ru/cln2840/www.mail. ru/pages/help/index.html"><img
src="/mail/ru/images/helpm.gif" 
width="14" height="14" alt="" class="right" /></a> 
</td> 
</tr> 
<tr> 
<td class="title1">Имя </td> 
<td class="mail"><table><tr> 
<td class="login"><input type="text" class="long" size="10" name="Login" 
tabindex="1" 
value="programmers" /><div>&nbsp;</div></ td> 
<td class="domain"><select size="1" name="Domain" class="long" tabindex="2"> 
<option value="mail.ru" 
selected="selected">@mail.ru</option><optio n value="inbox.ru" 
>@inbox.ru</option><option value="bk.ru" 
>@bk.ru</option><option value="list.ru" 
>@list.ru</option>
</select><div>&nbsp;</div></td> 
</tr></table></td> 
</tr> 
<tr> 
<td class="title2">Пароль</td> 
<td class="pswd"><table><tr> 
<td><input type="password" class="long" size="15" name="Password" tabindex="3"
value="" /></td> 
<td class="forget"><div><a href="http://win .mail.ru/cgi-
bin/passremind">Забыли?</a></div></td> 
</tr></table></td> 
</tr>
<tr> 
<td class="title3"> </td> 
<td class="button"><table><tr> 
<td class="check"><input type="checkbox" id="alien" name="level" value="1" 
tabindex="4" 
class="check" /></td>
<td class="bad"><label for="alien">Чужой компьютер</label> </td> 
<td class="submit"><input type="submit" value= "Войти" tabindex ="5" 
class="submit" /></td> 
</tr></table></td> 
</tr> 
</table> 
</form> 

На сервер могут отправится только значения элементов формы, которым относятся:
Тег input который отвечает за ввод информации и может принимать множество видов и вариантов.
Вплоть до выбора файла, но об этом уже в следующих темах.
Внимание, ВСЕ теги Input лучше заполнять перед отправкой, поэтому обращайте внимание на теги Input с параметром type, имеющим тип type="hidden". Более конкретно о них я расскажу в конце.
Тег <select> отвечает за выбор элемента из фиксированного списка. Внутри тега <select> должны присутствовать теги <option> каждый из которых описывает один из параметров списка. Выбранный элемент списка отображается свойством selected тега option но для нас это малоинтересно, нам гораздо интересней параметр value тега option, который отражает именно тот текст, который будет отправлен на сервер при выборе этого элемента. Ну вот собственно и все, теперь соберем всю необходимую нам информацию воедино:
Адрес, на который мы должны отправить запрос, чтобы авторизоваться мы берем из параметра action тега <form>

http://win.mail.ru/cgi-bin/auth 

Метод отправки запроса выбираем из параметра method тега <form>

method="post" 

Далее выбираем все необходимые нам поля:

<input type="text" class="long" size="10" name="Login" tabindex="1" value="" 
/> 
<select size="1" name="Domain" class="long" tabindex="2"> 
<option value="mail.ru" 
selected="selected">@mail.ru</ option><option value="inbox.ru " 
>@inbox.ru</ option>< option value="bk.ru" 
>@bk.ru</option><option value="list.ru"
>@list.ru</ option> 
</select> 
<input type="password" class="long" size="15" name="Password" tabindex="3" 
value="" /> 

Вот и все что нам понадобится.
Теперь перейдем к Delphi.
Создадим новый проект. "Бросим" на форму компонент IdHTTP из вкладки Indy Clients и кнопку.
теперь настроим наш компонент IdHTTP.
Поставим параметр AllowCookies в True (оговорюсь сразу: это на всякий случай, ибо далеко не всегда после авторизации и во время её задействованы cookies)
Выставим параметр HandleRedirects в True (вы можете и оставить этот параметр в False, но в этом случае рискуете после авторизации получить сообщение о просто успешном выполнении запроса, которое совершенно не говорит об успешности авторизации, либо о том, что был обнаружен redirect)
Этот параметр позволяет IdHTTP в случае получения директивы http redirect следовать этому перенаправлению. Дело в том, что в большинстве случаев скрипты, которые авторизую пользователя, после авторизации перенаправляют его на некую страницу, поэтому нам гораздо интересней узнать именно её текст.
Собственно и все, больше никаких параметров нам не потребуется.
Теперь напишем обработчик нажатия на кнопку:

procedure TForm5.btn1Click(Sender: TOb ject); 
var params,responseres:tstringlist; 
begin 
params:=TStringList.Create; responseres:=TStringList.Create; try params.Add('Login=programmers'); params.Add('Domain=mail.ru'); params.Add('Password=1234'); responseres.Text:=http1.Post('http://win.ma il.ru/cgi-bin/auth',params); if Pos('logout',responseres.Text)>0 then ShowMessage('Авторизовались!'); finally params.free; responseres.free; end; end;

Разберем код:
сначала нам необходимо создать список параметров, которые мы будем передавать серверу для успешной авторизации. Выше мы уже выделили все необходимые поля, которые нам надо заполнить.
Создадим список:

params:=TStringList.Create; 

и заполним его в соответствии со следующим правилом:
<параметр>=<значение>
Значение ни в какие кавычки заключать не надо.

params.Add('Login=programmers');
params.Add('Domain=mail.ru'); 
params.Add('Password=1234'); 

Обратит внимание, что мы присвоили параметру Domain значение mail.ru так как именно этот текст стоял в значении параметра value нужного нам тега option:

<option value="mail.ru">@mail.ru</option> 

Теперь отправим Post запрос (так как именно этот тип запроса используется в форме:

<form name="Auth" method="post" 

На адрес http://win.mail.ru/cgi-bin/auth так как именно он указан в качестве action формы:

<form name="Auth" method="post" action="http://win.mail.ru/cgi-bin/auth"> 

Результат выполнения нашего запроса мы сохраняем в свойстве text другого нашего списка строк. Итого в результате выполнения команды

responseres.Text:=http1.Post('http://win.mail.ru/cgi-bin/auth ',params); 

В переменной responseres мы получили весь исходный код страницы , которую нам вернул сервер после отправки формы . Для проверки корректности авторизации я воспользовался простым способом : на странице , которая отображается после авторизации присутствует кнопка
выхода , которая именуется logout, вот её - то м и ищем в полученной нами странице . И, если она присутствует , то значит авторизация прошла успешно =)

Пример авторизации на сайте с помощью idHTTP.Post

Несмотря на то, что все мои заготовки статей канули в Лету вместе с другими данными (в том числе исходниками), которые были на флешке, я не пала духом и попытаюсь написать что-нибудь полезное заново.

Сегодня расскажу, как использовать idHTTP.Post для авторизации на сайте. Я возьму для примера сайт LiveJournal.com.

Немного теории для начинающих. Итак, вызов метода Post компонента idHTTP отличается от вызова Get-а только тем, что помимо URL-а необходимо передать параметры. Параметры можно передавать в виде StringList-а, или каких-нибудь Stream-ов, или чего-нибудь еще подходящего.)

Пример Post-процедуры (параметры передаются в виде StringList-а):

procedure TForm1.Button1Click(Sender: TObject); 
var 
LoginInfo: TStringList;
Response: TStringStream;
begin
try 
LoginInfo := TStringList.Create; 
Response := TStringStream.Create('') ; 
LoginInfo.Add('username=MyName'); 
LoginInfo.Add('password=MyPass'); 
IdHTTP1.Post('http://mywebsite.xxx/lo gin.php',LoginInfo ,Response); 
Showmessage(Response.DataString); 
finally 
begin 
Response.Free; 
LoginInfo.Free; 
end; 
end; 
end; 

Пример Post-функции (параметры передаются в виде IdMultiPartFormDataStream-а):

uses IdMultipartFormData; 
{ .... } 
procedure TForm1.Button1Click(Sender: TObject); 
var 
data: TIdMultiPartFormDataStream; 
begin 
data := TIdMultiPartFormDataStream.Cre at e; 
try 
// добавляем нужные параметры
data.AddFormField('param1', 'value1'); 
data.AddFormField('param2', 'value2'); 
// для примера выводим в мемо все , что вернулось 
Memo1.Lines.Text := IdHTTP1.Post('http:// localhost/script.php', data); 
finally 
data.Free; 
end; 
end; 

Сейчас попробуем применить полученные знания. Идем на LiveJournal.com, включаем сниффер, логинимся на сайте и смотрим, какие параметры надо передавать ('mode=login', 'user=логин', 'password=пароль'). Авторизация не произойдет, если на стороне клиента не будут сохранены кукисы.
Для сохранения кукисов среди компонентов Indy существует TidCookieManager. IdCookieManager подключается к idHTTP через свойство CookieManager.

idHttp.CookieManager := IdCookieManager; 

В этом случае при запросах в заголовок добавляются кукисы, автоматически сохраненные в IdCookieManager. IdCookieManager можно найти на закладке Indy Misc или создать динамически.

Поместим на форму 2 TEdit-а, TMemo и кнопку, на которую повесим следующий работающий код авторизации:

procedure TForm1.Button1Click(Sender: TObject);
var 
Http : TidHttp; 
CM : TidCookieManager; 
Data : TStringList; 
StrPage, UserID, UserName : String; 
i : integer;
begin
try 
Http := TIdHTTP.Create(Self);
Data := TStringList.Create; 
CM := TidCookieManager.Create(Http); 
Http.AllowCookies := true; 
Http.CookieManager := CM; 
Http.HandleRedirects := true; 
Http.Request.Host:='livejournal.com'; 
Http.Request.UserAgent:='Mozilla/5.0 (W indows; U; Windows NT 5.1; ru; rv:1.9.0.10) 
Gecko/2009042316 Firefox/3.0.10'; 
Http.Request.Accept:='text/html,applicatio n/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
Http.Request.AcceptLanguage:='ru,en-us; q=0.7,en;q=0.3'; 
Http.Request.AcceptCharSet:='windows-12 51,utf-8;q=0.7,*;q=0.7'; 
Http.Request.Referer:='http://www.live journal.com/';
Data.Add('mode=login'); 
Data.Add('user=' + Edit1.Text); 
Data.Add('password=' + Edit2.Text); 
StrPage := Http.Post('http://www.livej ournal.com/login.bml?ret=1', Data);
finally 
Data.Free; 
CM.Free; 
Http.Free; 
end; 
if Pos('<input class="logoutlj_hidden" id="user" name="user" type="hid den" 
value="'+Edit1.Text,StrPage) <> 0 then
ShowMessage('Авторизация прошла успешно') 
else 
ShowMessage('Авторизация провалилась '); 
Memo1.Lines.Text := StrPage;
end; 

Возвращенные заголовки (после ответа сервера) можно посмотреть так:

idHttp.Response.RawHeaders.GetText; 

Сохраненные в CookieManager-е кукисы можно посмотреть так:

for i := 0 to Http.CookieManager.CookieC ollection.Count - 1 do 
StrPage := StrPage + CM.CookieCollecti on.Items[i].CookieTex t + #13#10;

Получить ссылку на материал

Категория: Разные | Добавил: Барон (15.12.2011)
Просмотров: 1447 | Теги: Авторизация, Сайт | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
Web-приложения [6]
Почта [12]
Работа с HTTP [4]
Робота с XML [4]
Сервер [3]
Разные [50]
Королевство Delphi © 2010-2024
Яндекс цитирования