Да, теперь скорее всего надо брать access_token и т.п. отсюда для следующих запросов.
Огромное тебя человеческое спасибо .! Дай вам бог здоровья и счастья Сегодня хватит, и так вчера не спал … Завтра буду продолжать . До завтра
Доброго вечера ребята Работал я на этого что как передать это параметры из 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
Это авторизация для этого… Не дают прямой доступ к сервером и требуют что конца дня передали им данных вот так… Продолжаю читать док и пилит . Если будет вопроси напишу… Пока всё нормально ! Спасибо всем
Судя по примерам в документации, там предполагается, что 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 сек), то это не проблема.
Я так думаю “может ошибаюсь” или для того что не работал некогда веб сервером. Я как-то уже магу авторизоваться на сайте с помощью Delphi XE3 да. Мне осталось передать данные через PUT . Надо потренироваться над этим и потом заключить код авторизации в процедуре и вызвать перед PUT . Вот тогда не понятно зачем мне это acces token и refresh token ? Почитаю буду изучать обязательно. Спасибо вам огромное и удачного дня. Очень помогал и много время уделял.
В документации должно быть написано что с ним делать, обычно добавить заголовок Authorization
с ним.
Без него соответственно не будут работать запросы.
Читаю
– Сервис для авторизаций использует 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
Здесь обсуждается : [Как добавить заголовок «Authorization = Bearer» http - How to add a "Authorization=Bearer" header with Indy in Delphi? - Stack Overflow Почитаю и потренируюсь
Там автор выбрал не особо удобный способ добавления, в комментах советуют так:
.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + ...;
Ну или
видимо то же самое.
Огромное спасибо, потренируюсь и напишу что получится
Такой вопрос
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')