Implementacja klienta oAuth

0

Trochę się męczyłem wiec daje dla gotowca jak w Lazarus pobrać "token_type": "Bearer"

Specyfikacja API ( https://auth0.com/docs -fajne środowisko jak ktoś chce się podszkolić trial 22 dni!)

curl --request POST
--url 'https://dev-qq/oauth/token'
--header 'content-type: application/x-www-form-urlencoded'
--data grant_type=client_credentials
--data client_id=YOUR_CLIENT_ID
--data client_secret=YOUR_CLIENT_SECRET
--data audience=YOUR_API_IDENTIFIERDodaj cytat...

jedyne na co trzeba zwrócić uwagę to składnia Params tu miałem trochę problemu oryginalnie składnia wyglądała tak:

Params : string = '{"title": "titre","body": "corps","userId": 1}';
uses fphttpclient, opensslsockets;

procedure TForm1.Button11Click(Sender: TObject);
var
  Client: TFPHttpClient;
  Response: TStringStream;
  
  Params: string = 'grant_type=client_credentials&client_id=SgJdGB38LFzn0m&client_secret=xku-oYvTfSgODXmU6854i3qIKaUEfWl6JnfIq91hwZUiyK9&audience=https://devauth0.com/api/v2/';

begin
  Client := TFPHttpClient.Create(nil);
  Client.AddHeader('Content-Type', 'application/x-www-form-urlencoded');
  Client.AllowRedirect := true;
  Client.RequestBody := TRawByteStringStream.Create(Params);
  Response := TStringStream.Create('');
  try
    try
       Client.Post('https://dev-qq/oauth/token', Response);
       form1.Memo1.Lines.Add('Response Code: ' + IntToStr(Client.ResponseStatusCode)); 
       Memo1.Append('Réponse : ' + Response.DataString);
    except on E: Exception do
      form1.Memo1.Lines.Add('Something bad happened: ' + E.Message);
    end;
  finally
    Client.RequestBody.Free;
    Client.Free;
    Response.Free;
  end;
  end; 

fphttpclient gotowiec do pobrania tokena może się komuś przyda

var
  Indy : TIdHTTP;
  IdSSL : TIdSSLIOHandlerSocketOpenSSL;
  Data : String;
  JSONToSend : TStringStream;
  Response: string;
begin
  Indy := TIdHTTP.Create(nil);
  try
    IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(Indy);
    IdSSL.SSLOptions.SSLVersions := [sslvTLSv1_2];
    Indy.IOHandler := IdSSL;
    Indy.Request.BasicAuthentication := False;
    Indy.Request.CustomHeaders.Values['content-type'] :='application/x-www-form-urlencoded';
    Data:='grant_type=client_credentials&client_id=SgJdGB38LFzn0m&client_secret=xku-oYvTfSgODXmU6854i3qIKaUEfWl6JnfIq91hwZUiyK9&audience=https://devauth0.com/api/v2/';
    
    JSONToSend := TStringStream.Create(Data,TEncoding.UTF8);
    try
      Response := Indy.Post('https://dev-qq/oauth/token',JSONToSend);
    finally
     JSONToSend.Free;
    end;
     memo1.Text := Response;
  finally
    Indy.Free;
  end;
end;  

Indy gotowiec do indy potrzebne są :

IdSSLIOHandlerSocketOpenSSL1 i IdHTTP1

Czy macie pomysł jak inaczej wprowadzić Data np. coś takiego

P1: grant_type=client_credentials
P2: client_id=SgJdGB38LFzn0m
P3: client_secret=xku-oYvTfSgODXmU6854i3qIKaUEfWl6JnfIq91hwZUiyK9
P4: audience=https://devauth0.com/api/v2/
0

Możesz zamiast TStringStream użyć TStringList na jedno wychodzi a moim zdaniem czytelniej dodawać po jednym parametrze:

sl.Add('grant_type=client_credentials');
sl.Add('client_id=SgJdGB38LFzn0m');

PS: W Indy masz Indy.Request.ContentType nie musisz dodawać na około przez CustomHeaders;

0

Podczas wysyłania danych na serwer (z predkoscia 500 ms) przy pomocy TFPHttpClient po pewnym czasie serwer zaczyna zglaszać error 500 i 504 a program zaczyna sie zamrażać. Jeżeli wyłącze program i włacze ponownie wszystko zaczyna działać poprawnie. Wyglada na to że server nie daje rady odbierać z taką prędkością.

HTTPSender.ConnectTimeout := 1500;
HTTPSender.IOTimeout      := 1500;

dodanie ConnectTimeout i IOTimeout nie pomaga dostaje dodatkowo error 0

Co moge z tym zrobić? Czy możecie mi coś dorobić

0

Po pierwsze raczej powinieneś założyć osobny wątek bo, tematem to nie ma nic wspólnego tamten wykorzystuje Indy.
Co to jest prędkość 500 ms? Chyba piszesz o częstotliwości wysyłania danych?
Poza tym przydałby się pełny kod (oczywiście bez danych logowania jeżeli jest logowanie).

0
kAzek napisał(a):

Po pierwsze raczej powinieneś założyć osobny wątek bo, tematem to nie ma nic wspólnego tamten wykorzystuje Indy.
Co to jest prędkość 500 ms? Chyba piszesz o częstotliwości wysyłania danych?
Poza tym przydałby się pełny kod (oczywiście bez danych logowania jeżeli jest logowanie).

Tak 500ms to częstotliwości wysyłania danych.

uses fphttpclient, opensslsockets;

procedure TForm1.Button11Click(Sender: TObject);
var
  Client: TFPHttpClient;
  Response: TStringStream;
  
  Params: string = 'grant_type=client_credentials&client_id=SgJdGB38LFzn0m&client_secret=xku-oYvTfSgODXmU6854i3qIKaUEfWl6JnfIq91hwZUiyK9&audience=https://devauth0.com/api/v2/';

begin
  Client := TFPHttpClient.Create(nil);
  Client.AddHeader('Content-Type', 'application/x-www-form-urlencoded');
  Client.AllowRedirect := true;
  Client.RequestBody := TRawByteStringStream.Create(Params);
  Response := TStringStream.Create('');
  // HTTPSender.ConnectTimeout := 1500;
  // HTTPSender.IOTimeout      := 1500;
  
  try
    try
       Client.Post('https://dev-qq/oauth/token', Response);
       form1.Memo1.Lines.Add('Response Code: ' + IntToStr(Client.ResponseStatusCode)); 
       Memo1.Append('Réponse : ' + Response.DataString);
    except on E: Exception do
      form1.Memo1.Lines.Add('Something bad happened: ' + E.Message);
    end;
  finally
    Client.RequestBody.Free;
    Client.Free;
    Response.Free;
  end;
  end; 
  
procedure TForm1.Button1Click(Sender: TObject);
begin
  form1.Timer1.Interval:=500;
  form1.Timer1.Enabled:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  form1.Button11.Click;
end; 
  

Dodam że jeżeli wysyłam do serwera dane z czestotliwościa co np. 5000ms to problem sie nie pojawia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1