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

Судя по примерам в документации, там предполагается, что 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')

Ладно , Я быстро изучил парсит JSON текст. есть несколько модуль который можно скачать GitHub - hgourvest/superobject там есть несколько модуль -надо его скопировать папке проекта, я пользуюсь только superobject,

  1. Скопировать все .pas файл папке проекта
  2. Подключить Uses superobject,
procedure TForm1.Button1Click(Sender: TObject);
var
  JSONObject: ISuperObject;
begin
  JSONObject:=TSuperObject.Create;
  JSONObject:=SO('{"name":"val"}');
  Edit1.Text:=JSONObject.S['name'];

end;
  1. Как только я это изучил , легко магу парсит JSON текст из Memo1 который я получаю . и магу то что захочу access_token , token_type или session_state
procedure TForm1.Button1Click(Sender: TObject);
  var
    MyParams : TStringList;
     //--- JSON
     JSONObject: ISuperObject;
     // Для хранение текста ! то что хранил Memo1
     MyAutorized : String;
     //--- Для отправка данных на сервере
     RequestBody: TStringStream;
begin
  try
    // ---TStringList Создать
    MyParams:= TStringList.Create;
    //---- Всё параметри внимательно
    MyParams.Add('username=xxxx@gmail.com') ;
    MyParams.Add('password=xxx');
    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';
    // Хранить тексть запроса на  MyAutorized
    MyAutorized := IdHTTP1.Post('https://accounts.police.ge/auth/realms/company/protocol/openid-connect/token', MyParams);
    //--------Создать----------
    JSONObject:=TSuperObject.Create;
    //---Передать все тексть
    JSONObject:=SO(MyAutorized);
    //----Получить только  access_token  Edit1.Text
    Edit1.Text:=JSONObject.S['access_token'];
        //-------Попитка отправить данных (тест...) --------
  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;      // Уже передаю из Edit1.Text ?
  idHTTP1.Request.CustomHeaders.Values['Authorization'] := 'Bearer '  + Edit1.Text;
  //----------------------------------------------------------------
  idHTTP1.Put('https://accounts.police.ge/auth/realms/company/protocol/openid-connect/token', RequestBody);
  RequestBody.Free;
  finally
     MyParams.Free;
  end;
end;

end.

Я передаю только Edit1.Text:=JSONObject.S[‘access_token’]; тоже самое ощибка .

ещё вопрос: вот это URL который я передаю в PUT

idHTTP1.Put('https://accounts.police.ge/auth/realms/company/protocol/openid-connect/token', RequestBody);

Это тот URL который при авторизации и это правильно ? У меня нету другой URL и документации при отправке данных PUT нету другой URL как думаете ?

или может для того что у меня параметре ’ “name”: “photo name.jpg” = name.jpg - этого нету . может быть для этого ?

Вряд ли, обычно он только для авторизации, для других запросов другие URL.

Как узнать какой url если его нету в документации ? написано только этого : что если данных будет передано успешно то сервер будет возвращаться число 201