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

Да, теперь скорее всего надо брать 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.

имеется в виду отправить запросе перед PUT ?

Надо во все последующие запросы добавить заголовок (header) Authorization: Bearer eyJhbG.........Q6A

Про put я нашел такой пример Delphi JSON idHTTP PUT / Delphi / Sql.ru хочу это пример применят .
Для отправки данных документации написано отправить данных через PUT параметры вот это если всё успешно отправлено я должен получить ответ: 201

{ "customerId": "0", "personalNo": "00000000000", "firstName": "სახელი", "lastName": "გვარი", "citizenship": "GEO", "birthDate": "1900-01-01", "realAddress": "ფაქტობრივი მისამართი", "phone": "500000000", "itemList": [ { "createDate": "1900-01-01", "itemId": "0", "type": "itemTechnic", "subType": "ქვეტიპი", "brand": "მწარმოებელი/ბრენდი", "model": "მოდელი", "serialNumber": "ინდივიდუალური კოდი/imei", "price": "0.00", "currency": "GEL", "info": "დამატებითი ინფორმაცია", "photos": [ { "data": "Base64 Data", "name": "photo name.jpg" } ] } ] }

Я после авторизаций питаюсь отправить данных

procedure TForm1.Button1Click(Sender: TObject);
  var
  RequestBody: TStringStream;
begin
 //------Код Авторизаций на это процедуре
  Avtorization();
  //-------Попитка отправить данных (тест...) --------
  idHTTP1.Request.ContentType := 'application/json';
  idHTTP1.Request.ContentEncoding := 'utf-8';
  //------------
  RequestBody:=TStringStream.Create('{ "customerId": "0", "personalNo": "00000000000", '+
                                    ' "firstName": "სახელი", "lastName": "გვარი", "citizenship": "GEO", '+
                                    ' "birthDate": "1900-01-01", "realAddress": "ფაქტობრივი მისამართი", '+
                                    ' "phone": "500000000", "itemList": [ { "createDate": "1900-01-01", "itemId": "0", '+
                                    ' "type": "itemTechnic", "subType": "ქვეტიპი", "brand": "მწარმოებელი/ბრენდი", '+
                                    ' "model": "მოდელი", "serialNumber": "ინდივიდუალური კოდი/imei", "price": "0.00", '+
                                    ' "currency": "GEL", "info": "დამატებითი ინფორმაცია", "photos": [ { "data": "Base64 Data", '+
                                    ' "name": "photo name.jpg" } ] } ] }', TEncoding.UTF8);
  Memo1.Text:=idHTTP1.Put('https://accounts.police.ge/auth/realms/company/protocol/openid-connect/token', RequestBody);
  RequestBody.Free;
end;

end.

Получаю Method not allowed - Метод не разрешен . Как я должен передать access_token

Гугл вроде бы говорит, что заголовки добавляются через .Request.CustomHeaders.AddValue

1 лайк

Здесь обсуждается : [Как добавить заголовок «Authorization = Bearer» http - How to add a "Authorization=Bearer" header with Indy in Delphi? - Stack Overflow Почитаю и потренируюсь

Там автор выбрал не особо удобный способ добавления, в комментах советуют так:

.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + ...;

Ну или

видимо то же самое.

1 лайк

Огромное спасибо, потренируюсь и напишу что получится :wink:

Такой вопрос

  idHTTP1.Request.CustomHeaders.FoldLines := False;      // Здесь передать Memo1.Text правильно ?
  idHTTP1.Request.CustomHeaders.Values['Authorization'] := 'Bearer '  + Memo1.Text;

Я передаю всё текст то что получил при авторизаций . там есть кроме “access_token”:“ ещё много чего да ? и это правильно так передать ?
Все код

procedure TForm1.Button1Click(Sender: TObject);
  var
  RequestBody: TStringStream;
begin
 //------Код Авторизаций на это процедуре
  Avtorization();
  //-------Попитка отправить данных (тест...) --------
  idHTTP1.Request.ContentType := 'application/json';
  idHTTP1.Request.ContentEncoding := 'utf-8';

  //------------
  RequestBody:=TStringStream.Create('{ "customerId": "0", "personalNo": "00000000000", '+
                                    ' "firstName": "სახელი", "lastName": "გვარი", "citizenship": "GEO", '+
                                    ' "birthDate": "1900-01-01", "realAddress": "ფაქტობრივი მისამართი", '+
                                    ' "phone": "500000000", "itemList": [ { "createDate": "1900-01-01", "itemId": "0", '+
                                    ' "type": "itemTechnic", "subType": "ქვეტიპი", "brand": "მწარმოებელი/ბრენდი", '+
                                    ' "model": "მოდელი", "serialNumber": "ინდივიდუალური კოდი/imei", "price": "0.00", '+
                                    ' "currency": "GEL", "info": "დამატებითი ინფორმაცია", "photos": [ { "data": "Base64 Data", '+
                                    ' "name": "photo name.jpg" } ] } ] }', TEncoding.UTF8);
                                      //------------
  idHTTP1.Request.CustomHeaders.FoldLines := False;      // Здесь передать Memo1.Text правильно ?
  idHTTP1.Request.CustomHeaders.Values['Authorization'] := 'Bearer '  + Memo1.Text;
  //----------------------------------------------------------------
  idHTTP1.Put('https://accounts.police.ge/auth/realms/company/protocol/openid-connect/token', RequestBody);
  RequestBody.Free;
end;

ещё Method not allowed почему не разрешен ?

Нет, надо достать значение токена.

Что-то типа jsonObj.Get('access_token')