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

Огромное спасибо за внимание. Я магу на другом ПК установить 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:

Судя по примерам в документации, там предполагается, что Client/Request/Response либо связаны в дизайнере формы (или может быть просто присваиванием в соответствующие свойства), либо например в Execute передается Request.
Tutorial: Using the REST Client Library to Access REST-based Web Services - RAD Studio
http://docwiki.embarcadero.com/RADStudio/Sydney/en/REST_Client_Library#Accessing_Facebook_API

TRestClient может быть удобен тем, что там для OAuth есть что-то готовое REST.Authenticator.OAuth.TOAuth2Authenticator - RAD Studio API Documentation
особенно если надо например использовать refresh_token.
access_token перестает работать через какое-то время, похоже тут 300 сек

и надо получать новый, либо через refresh_token, либо тем же запросом с паролем и т.д., что изначально.

Хотя если сессии короткие (короче 300 сек), то это не проблема.

1 лайк

Я так думаю “может ошибаюсь” или для того что не работал некогда веб сервером. Я как-то уже магу авторизоваться на сайте с помощью Delphi XE3 да. Мне осталось передать данные через PUT . Надо потренироваться над этим и потом заключить код авторизации в процедуре и вызвать перед PUT . Вот тогда не понятно зачем мне это acces token и refresh token ? Почитаю буду изучать обязательно. Спасибо вам огромное и удачного дня. Очень помогал и много время уделял.

В документации должно быть написано что с ним делать, обычно добавить заголовок Authorization с ним.
Без него соответственно не будут работать запросы.

1 лайк

Читаю
– Сервис для авторизаций использует OAuth 2 стандарт
– Сервисе, для применения методов нужно http request-е header-е выходилос Authorization: Bearer <ACCESS_TOKEN>
– Сервисный credential-ов

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
Мы это проходили да ?

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”:“eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJRZS11T3k0eE5pZXVNMy0xa2swMUNLWURJOHQ1eF9pMktNRGF2OEpsYUNjIn0.eyJleHAiOjE2MTU5MDM4OTksImlhdCI6MTYxNTkwMzU5OSwianRpIjoiYjg1YmI0NTMtODI5OC00YTg1LWI5NzgtNDk4NGMwYjBkNjNhIiwiaXNzIjoiaHR0cHM6Ly9hY2NvdW50cy5wb2xpY2UuZ2UvYXV0aC9yZWFsbXMvY29tcGFueSIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiIyY2JkYTZmNi1mN2UzLTQ5MmItOGE3ZC0xZjYxNjQ4NDcxOWYiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJsb21iYXJkLXNlcnZpY2UiLCJzZXNzaW9uX3N0YXRlIjoiMWEzZjRmZjMtOWRmOC00MjE3LWE5NDUtOWFhNWY2ZWFkZTQzIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vMTAuMS4xLjQ3OjcwMjUiLCJodHRwOi8vMTAuMjguNy4yMDI6ODA4MCIsImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIsImh0dHA6Ly8xMC4xLjEuNDc6NzAyNCIsImh0dHBzOi8vYXBpLnBvbC5nZSJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiIwMTAyNzAwMDU1MiIsImVtYWlsIjoibWFsdmluYWthemFyaWFuQGdtYWlsLmNvbSJ9.eYTE6P6pJTmE2XO4G0lq8c2rBDEtpbnA2UWfkUZksjI5qWIk1JFNQgp_UT3-pFnkWb8o6KhVYo1U0PnA2cI11wcFhJ5392hGQQIb3gHqrWst3i5deoNmVTC8R8NTiy_mdDdE67eyisf4PhwPgpFMdqXgJJMWw-bKCUYeD6YRhleZg76vGM46xAD_7rpkNkDZHa1Gra3QFd9ZQD6PkZWma1GNEz-9c9UFaonw9xA3E82ZJ7v05egaQaxk_AScIkU5WaWXXHLOWlQP3KYn196vISF9qJqHA9QKThYoq-5BoIihch-QX4FyqZxsi7BPrzfZp4msKr4D5c1xGZvJPrGQ6A”,“expires_in”:300,“refresh_expires_in”:1800,“refresh_token”:“eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIwZmU5Mzg2YS0wZDNkLTRkMTQtYmQ1Ny0xODM1YTdhZGQzY2EifQ.eyJleHAiOjE2MTU5MDUzOTksImlhdCI6MTYxNTkwMzU5OSwianRpIjoiMmQwY2QzYmYtODZmZS00ZWY3LTljN2EtODdkZjQ3NTcxMDYxIiwiaXNzIjoiaHR0cHM6Ly9hY2NvdW50cy5wb2xpY2UuZ2UvYXV0aC9yZWFsbXMvY29tcGFueSIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMucG9saWNlLmdlL2F1dGgvcmVhbG1zL2NvbXBhbnkiLCJzdWIiOiIyY2JkYTZmNi1mN2UzLTQ5MmItOGE3ZC0xZjYxNjQ4NDcxOWYiLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoibG9tYmFyZC1zZXJ2aWNlIiwic2Vzc2lvbl9zdGF0ZSI6IjFhM2Y0ZmYzLTlkZjgtNDIxNy1hOTQ1LTlhYTVmNmVhZGU0MyIsInNjb3BlIjoicHJvZmlsZSBlbWFpbCJ9.Ea5eypvuUdA7awHUAhvYS9nLDI6RokDmfqaH2D0JKUg”,“token_type”:“bearer”,“not-before-policy”:0,“session_state”:“1a3f4ff3-9df8-4217-a945-9aa5f6eade43”,“scope”:“profile email”}
.

Это и есть Authorization: Bearer <ACCESS_TOKEN> или что то другой я должен получить ?

Да, этот.
Ну то есть эта часть:

которую надо достать из поля access_token этого JSON.