Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2015, 06:28   #1
Bright-rider
Форумчанин
 
Регистрация: 09.07.2010
Сообщений: 102
Печаль Авторизация в Google

Доброго времени суток!
Пытаюсь авторизоваться в Google.
https://accounts.google.com/ServiceLoginAuth
Снифферил запросы, пробовал разные заголовки.
После POST запроса при правильном пароле идет несколько редиректов 302. (При неправильном пароле сразу ответ 200).
На одном из редиректов программу снова отправляют на форму авторизации и так по кругу.
Т.е. вроде как авторизация проходит, но не до конца.
Помогите, пожалуйста, найти ошибку.
Заранее спасибо.
P.S.: Использую библиотеку synapse, класс httpsend, на форме 1 memo для логирования.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
http:thttpsend;
t:tstringlist;
galx,profile,s:string;
email,password:string;
begin
email:='mymail%40gmail.com';
password:='mypassword';
t:=tstringlist.Create;
http:=thttpsend.Create;

http.UserAgent:='Mozilla/5.0 (Windows NT 6.1; rv:29.0) Gecko/20100101 Firefox/29.0';
http.Protocol:='1.1';

//Получаем страничку с формой
http.HTTPMethod('get','https://accounts.google.com/ServiceLoginAuth');
t.LoadFromStream(Http.Document);
HTTP.Headers.Clear;
HTTP.Document.Clear;

//Парсим параметр
galx:=reg(t.Text,'<input name="GALX" type="hidden".*?value="(.*?)"');
memo1.lines.add('galx='+galx);
//Формируем запрос
s:='Page=PasswordSeparationSignIn&GALX='+galx+
'&DisplayName='+
'&ProfilePhoto='+
'&ProfileInformation='+
'&_utf8=%E2%98%83'+
'&bgresponse=js_disabled'+
'&pstMsg=0'+
'&dnConn='+
'&checkConnection='+
'&checkedDomains=youtube'+
'&Email='+email+
'&identifiertoken='+
'&identifiertoken_audio='+
'&identifier-captcha-input='+
'&signIn=%D0%94%D0%B0%D0%BB%D0%B5%D0%B5'+
'&Passwd='+
'&PersistentCookie=yes'+
'&rmShown=1';
write(http,s);
http.MimeType:='application/x-www-form-urlencoded';
http.Headers.Add('Referer: https://accounts.google.com/ServiceLoginAuth');
//Отправляем логин
http.HTTPMethod('post','https://accounts.google.com/AccountLoginInfo');
t.LoadFromStream(Http.Document);
HTTP.Headers.Clear;
HTTP.Document.Clear;

//Снова парсим параметры
galx:=reg(t.Text,'<input name="GALX" type="hidden".*?value="(.*?)"');
profile:=reg(t.Text,'ProfileInformation" type="hidden" value="(.*?)"');
memo1.lines.add('galx='+galx);
memo1.lines.add('profile='+profile);
//Формируем запрос
s:='Page=PasswordSeparationSignIn'+
'&GALX='+galx+
'&checkedDomains=youtube'+
'&checkConnection='+
'&pstMsg=0'+
'&DisplayName='+
'&ProfilePhoto='+
'&ProfileInformation='+profile+
'&_utf8=%E2%98%83'+
'&bgresponse=js_disabled'+
'&pstMsg=0'+
'&dnConn='+
'&checkConnection='+
'&checkedDomains=youtube'+
'&Email='+email+
'&Passwd='+password+
'&signIn=%D0%92%D0%BE%D0%B9%D1%82%D0%B8'+
'&PersistentCookie=yes'+
'&rmShown=1';
http.MimeType:='application/x-www-form-urlencoded';
write(http,s);
http.Headers.Add('Referer: https://accounts.google.com/AccountLoginInfo');
//Отправляем логин+пароль
http.HTTPMethod('post','https://accounts.google.com/ServiceLoginAuth');
memo1.lines.add('POST');
memo1.lines.add(inttostr(http.ResultCode));
//Если логин/пароль введен неверно - отдается 200 код
//Если введен вверно - идет несколько редиректов, которые мы обрабатываем
if (HTTP.ResultCode=302) then
begin
//1-ый редирект будет куда-то сюда https://accounts.google.com/CheckCookie...
memo1.lines.add('');
s:=reg(http.headers.Text,'Location: (.*?)\n');
HTTP.Headers.Clear;
HTTP.Document.Clear;
http.Headers.Add('Referer: https://accounts.google.com/AccountLoginInfo');
http.HTTPMethod('get',s);
memo1.lines.add('GET');
memo1.lines.add(s);
memo1.lines.add(inttostr(http.ResultCode));

//2-ой редирект будет куда-то сюда https://accounts.google.com.ua/accounts/SetSID...
memo1.lines.add('');
s:=reg(http.headers.Text,'Location: (.*?)\n');
HTTP.Headers.Clear;
HTTP.Document.Clear;
http.Headers.Add('Referer: https://accounts.google.com/AccountLoginInfo');
http.HTTPMethod('get',s);
memo1.lines.add('GET');
memo1.lines.add(s);
memo1.lines.add(inttostr(http.ResultCode));

//3-ой редирект будет куда-то сюда https://accounts.google.com.ua/accounts/SetSID...
//но уже с немного другими get параметрами
memo1.lines.add('');
s:=reg(http.headers.Text,'Location: (.*?)\n');
HTTP.Headers.Clear;
HTTP.Document.Clear;
http.Headers.Add('Referer: https://accounts.google.com/AccountLoginInfo');
http.HTTPMethod('get',s);
memo1.lines.add('GET');
memo1.lines.add(s);
memo1.lines.add(inttostr(http.ResultCode));

//4-ий редирект на https://accounts.google.com/ManageAccount
memo1.lines.add('');
s:=reg(http.headers.Text,'Location: (.*?)\n');
HTTP.Headers.Clear;
HTTP.Document.Clear;
http.Headers.Add('Referer: https://accounts.google.com/AccountLoginInfo');
http.HTTPMethod('get',s);
memo1.lines.add('GET');
memo1.lines.add(s);
memo1.lines.add(inttostr(http.ResultCode));

//вот здесь браузер отправляют на https://www.google.com/settings/?authuser=0
//а программу на форму авторизации
memo1.lines.add('');
s:=reg(http.headers.Text,'Location: (.*?)\n');
memo1.lines.add(s);
end else
memo1.Lines.Add('Неправильный логин/пароль');
http.Free;
t.Free;
end;

Последний раз редактировалось Stilet; 08.06.2015 в 12:56.
Bright-rider вне форума Ответить с цитированием
Старый 08.06.2015, 06:30   #2
Bright-rider
Форумчанин
 
Регистрация: 09.07.2010
Сообщений: 102
По умолчанию

Пару функций, которые не влезли в первый пост
Код:
//функция вытягивает первое вхождение по регулярке
function TForm1.reg(s, p: string): string;
var
RegEx: TRegEx;
M: TMatchCollection;
Options: TRegExOptions;
begin
Options:=[];
Include(Options, roSingleLine);
RegEx:=TRegEx.Create('');
M:=RegEx.Matches(s,p,Options);
if (M.count>0) then
result:=M.Item[0].Groups[1].value
else
result:='-1';
end;

//запись строки в тело запроса
procedure TForm1.write(http: thttpsend; s: string);
var
Data: TStringStream;
begin
Data:=TStringStream.Create(s);
http.Document.LoadFromStream(Data);
data.Free;
end;

Последний раз редактировалось Stilet; 08.06.2015 в 12:56.
Bright-rider вне форума Ответить с цитированием
Старый 08.06.2015, 09:47   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Снифферил запросы, пробовал разные заголовки.
OAuth это протокол авторизации, по нему есть документация. Без API ключа вас пошлет в лес.
Человек_Борща вне форума Ответить с цитированием
Старый 08.06.2015, 09:53   #4
Bright-rider
Форумчанин
 
Регистрация: 09.07.2010
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
OAuth это протокол авторизации, по нему есть документация. Без API ключа вас пошлет в лес.
С API проблем нет, но задача другая.
Задача стоит авторизоваться по логину и паролю, без использования API.
Bright-rider вне форума Ответить с цитированием
Старый 08.06.2015, 10:11   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Задача стоит авторизоваться по логину и паролю, без использования API.
Не вижу проблем не использовать API, все тоже самое только работает годами.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перенос даты из формы Google в календарь Google. (Google Apps) katalnikov Фриланс 2 24.11.2012 22:42
Twebbrowser + google + авторизация = ошибка winhttp Работа с сетью в Delphi 1 31.08.2012 01:32
Авторизация через Google Godfather07 Помощь студентам 0 02.03.2012 14:41
авторизация на почте google с адресной строки Vistar HTML и CSS 1 21.06.2010 10:06