Delphi авторизация на сайте https

Доброго дня ребята . Документации предоставили что сайт для авторизации применятся OAuth2 стандарт . Дали аккаунт

Логин: xxxxxxxxx@gmail.com
Пароль: *********

Через браузер всё открывается, работает … Документации которые предоставили есть такой параметры для авторизации

curl
-d “username=xxxxxxxxx@gmail.com
-d “password=*********”
-d “client_id=lombard-service”
-d “client_secret=7676a315-eb0e-4123-bcbf-e5ee8710a422”
-d “grant_type=password”
https://accounts.police.ge/auth/realms/company/protocol/openid-connect/token

Я стараюсь подключится из Delphi XE3 с помощью indy 10.5.9.0 вот так


type
 TForm1 = class(TForm)
   IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
   IdHTTP1: TIdHTTP;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 params, responseres: TStringList;
 OpenSSL : TIdSSLIOHandlerSocketOpenSSL;

begin
 //-------------------------------
 IdHTTP1.HandleRedirects := true;
 //--------------------------------
   IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
 //----------------------
 OpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
 OpenSSL.SSLOptions.Method := sslvSSLv23;
 OpenSSL.SSLOptions.Mode := sslmUnassigned;
 //----------------------
 params := tstringlist.Create;
 responseres := tstringlist.Create;
 try
  //--------------------------------
   params.Add('username=xxxxxxxxx@gmail.com');
   params.Add('password=*********');
   params.Add('client_id=lombard-service');
   params.Add('client_secret=7676a315-eb0e-4123-bcbf-e5ee8710a422');
   params.Add('grant_type=password');
   //--------------------------------
    IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
    IdHTTP1.Request.Charset := 'utf-8';
   //--------------------------------
   responseres.Text := IdHTTP1.Post('https://accounts.police.ge/auth/realms/company/protocol/openid-connect/token', params);
   if Pos('logout', responseres.Text) <> 0 then
     ShowMessage('Авторизовались!')
   else
     ShowMessage('Error');
 finally
   params.Free;
   responseres.Free;
   OpenSSL.Free;
 end;

end;

end.

Есть libeay32.dll и ssleay32.dll папке где приложения .exe
– Почему я не магу авторизовать ? Где я допускаю ошибку ?
– Может не через indy 10.5.9.0 и может есть другой библиотека для работы веб сервером ?
Помогите пожалуйста если можете :wink:

Может лучше установить Delphi 10.3 и попробовать через REST Client Library как здесь REST Client Library - RAD Studio или можно тоже через indy 10.5.9.0

Может там это просто для примера и надо разбираться как свои сгенерировать. Может быть просто где-нибудь в настройках аккаунта, что-нибудь про добавление интеграций/приложений.

Эту ошибку оно наверно не решит само, но скорее всего как минимум удобнее, чем инди.

1 лайк

Если так

   //--------------------------------
    params.Add('username=malvinakazarian@gmail.com');
    params.Add('password=malvina1978');
    params.Add('client_id=lombard-service');
//    params.Add('client_secret=7676a315-eb0e-4123-bcbf-e5ee8710a422');
//    params.Add('grant_type=password');

Без client_secret и без grant_type тогда у меня сообщения: bad request

На пример как ?

Желательно узнать еще каким протоколом безопасности пользуются. Для работы с TLS3 приходилось обновлять инди на 10.6.2, + версия библиотек должна соответствовать версии инди (подбирал опытным путем), для этой версии инди остановился на 1.0.2.18.

советую изначально проверить отправку запросов через стороннее приложение postman и подобное. и затем когда удостоверитесь что шлете запрос правильно - смотреть чего не хватает в коде.

1 лайк

не то процитировал, grant_type это просто способ авторизации, возможно есть другие с другими данными.

Обычно есть страница, где id и secret генерируются, типа такого

1 лайк

Огромное спасибо за внимание. Я магу на другом ПК установить Rad Studio 10.3 и там есть свежи версия indy . Но версия библиотек =.DLL файлов тоже найду.

Не знаю, не когда не пользовался postman-ом , посмотрю в google спасибо вам и хорошего дня для советов, для поддержки.

Как вариант можно просто curl установить, и выполнить в консоли команду из примера в документации:

curl - Download

1 лайк

Огромное спасибо… Попробую .

Не знаю. у меня не такой

Я установил curl смотрел примеров как его вызвать из консоли и как передать мои код
смотрел здесь Curl bash script for getting a Google Oauth2 Access token · GitHub


и вот что я делаю
Вот мне интересно: Я делаю что то неправильно или параметры который мне передали доке - то он неправильны ?
Что я первый раз делаю такого задачу - это и так видно . Хочу изучать - разобрать и делать самому

хм, странная ошибка. Можно попробовать добавить флаг -k, чтоб не проверяло сертификат.

1 лайк

Скачал и установил эту postman у меня документации сказано что авторизации применятся по OAuth2 - протоколу .
Сказано что : Авторизации (ACCESS_TOKEN и REFRESH_TOKEN) принимает такого параметров

curl
-d “username=xx@gmail.com
-d “password=xxx”
-d “client_id=lombard-service”
-d “client_secret=7676a315-eb0e-4123-bcbf-e5ee8710a422”
-d “grant_type=password”
https://accounts.police.ge/auth/realms/company/protocol/openid-connect/token
и вопрос про postman: Как его заполнить правильно из моего примеров ? grant_type какой выбрать ?

Спасибо что так много время уделияте и помогайте . Пожалуйста можете мне показать на это примере где добавит -K ?

-d username=xxxxxx@gmail.com -d password=******* -d client_id=lombard-service -d client_secret=7676a315-eb0e-4123-bcbf-e5ee8710a422 -d grant_type=password https://accounts.police.ge/auth/realms/company/protocol/openid-connect/token

в любом месте до адреса в конце

curl --help
Usage: curl [options...] <url>

Еще -v можно добавить, чтоб получить все заголовки и прочую инфу

curl -v www.google.com
*   Trying 216.58.209.4:80...
* TCP_NODELAY set
* Connected to www.google.com (216.58.209.4) port 80 (#0)
> GET / HTTP/1.1
> Host: www.google.com
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Fri, 12 Mar 2021 21:29:14 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1
< P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
< Server: gws
< X-XSS-Protection: 0
< X-Frame-Options: SAMEORIGIN
< Set-Cookie: NID=211=WJBHFIY3bsGi395sXHvwILFkZoe_3V8GC0mZVXglOV5jC7JdxM11cyzhC4mwyK2WZ_9etxsNp2Vo1o0IAUriabVYmyUnSI8DwnK5_itx241AUlWK6is0-RixmLd2UQhDQfzHspwqScbZXpl87PfhY5EWbHrfuVlFzrLgxyw7p50; expires=Sat, 11-Sep-2021 21:29:14 GMT; path=/; domain=.google.com; HttpOnly
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
< 
<!doctype html><html .........................
1 лайк

Я добавил перед все -d к вот так -kd и получил вот такой сообщения


Это что ? Я авторизоваться ?

Да, теперь скорее всего надо брать access_token и т.п. отсюда для следующих запросов.

1 лайк

Огромное тебя человеческое спасибо .! Дай вам бог здоровья и счастья :raised_hand: Сегодня хватит, и так вчера не спал :sweat_smile:… Завтра буду продолжать . До завтра :handshake:

Доброго вечера ребята :handshake: Работал я на этого что как передать это параметры из Delphi на втором ПК установил RAD Studio 10.4 и начинал авторизовать через REST Client = стандартная библиотека , Не знаю как моего мнения на эту задачу мне его НЕ заработал или что то я упустил. Короче, попытался я авторизовать так

procedure TForm1.Button1Click(Sender: TObject);
var
  RESTClient1: TRESTClient;
  RESTRequest1: TRESTRequest;
  strImageJSON : string;
begin
  RESTClient1 := TRESTClient.Create('https://accounts.police.ge/auth/realms/company/protocol/openid-connect/token');
  try
    RESTRequest1 := TRESTRequest.Create(nil);
    try
      RESTRequest1.Method := TRESTRequestMethod.rmPOST;
      RESTRequest1.AddParameter('username', 'xxxxn@gmail.com', TRESTRequestParameterKind.pkREQUESTBODY);
      RESTRequest1.AddParameter('password', '*****', TRESTRequestParameterKind.pkREQUESTBODY);
      RESTRequest1.AddParameter('client_id', 'lombard-service', TRESTRequestParameterKind.pkREQUESTBODY);
      RESTRequest1.AddParameter('client_secret', '7676a315-eb0e-4123-bcbf-e5ee8710a422', TRESTRequestParameterKind.pkREQUESTBODY);
      RESTRequest1.AddParameter('grant_type', 'password', TRESTRequestParameterKind.pkREQUESTBODY);
      RESTRequest1.Client := RESTClient1;
      RESTRequest1.Execute;
      strImageJSON := RESTRequest1.Response.Content;
    finally
      RESTRequest1.Free;
    end;
  finally
    RESTClient1.Free;
  end;

end;

Оставил я это ПК где у меня RAD Studio 10.4 и вернулся моего второго ПК где установлено RAD Studio XE3 и стандартное indy 10.5.9.0 и вот заработало через SSL
libeay32.dll и ssleay32.dll выложу который должен в папке проекта indy_dll.rar (540 КБ) У меня 64-бит ОС но с этим dll-ом я работал на 32-бит ОС тоже …
Код авторизации который работает

procedure TForm1.Button1Click(Sender: TObject);
  var
    MyParams : TStringList;
begin
  try
    // ---TStringList Создать
    MyParams:= TStringList.Create;
    //---- Всё параметри внимательно
    MyParams.Add('username=xxxxn@gmail.com') ;
    MyParams.Add('password=******');
    MyParams.Add('client_id=lombard-service') ;
    MyParams.Add('client_secret=7676a315-eb0e-4123-bcbf-e5ee8710a422');
    MyParams.Add('grant_type=password') ;
  //--------HandleRedirects := true; ----------------------
   IdHTTP1.HandleRedirects := true;
   // --------Только это для SSL -----------
   IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
  //--Без этого тоже работает. Но я добавил что запрос отправил utf-8 -------------------
     IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
     IdHTTP1.Request.Charset := 'utf-8';
  //---IdHTTP1.Post('https: отправляю запрос и в конце передаю MyParams
  // И ответ запроса получаю Memo1 ------------------
    Memo1.Lines.Text := IdHTTP1.Post('https://accounts.police.ge/auth/realms/company/protocol/openid-connect/token', MyParams);
  finally
     MyParams.Free;
  end;
end;

end.

Это да ?

{"access_token":"eyJhbGciO................5GpVM24Ii4lHPS_A","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOi...........t-ncf98","token_type":"bearer","not-before-policy":0,"session_state":"464c5aaf-93c3-4a9a-8913-de04e743ea19","scope":"profile email"}

Мне ещё надо разобраться отправить данных из MS SQL типа SELECT … FROM , WHERE
Это авторизация для этого… Не дают прямой доступ к сервером и требуют что конца дня передали им данных вот так… Продолжаю читать док и пилит . Если будет вопроси напишу… Пока всё нормально ! Спасибо всем :wink: