Google OAuth con Indy in Delphi
Domanda
Sto usando Indy10 con Delphi e cercando di ottenere OAuth di Google al lavoro. Il primo passo è quello di effettuare una richiesta al metodo OAuthGetRequestToken. Il seguente codice restituisce un errore 400. Qualsiasi aiuto sarebbe molto apprezzato.
procedure TForm1.Button1Click(Sender: TObject);
var
IdHTTP: TIdHTTP;
IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocketOpenSSL;
Params: TStringList;
mString: String;
begin
Params := tstringlist.create;
IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocketOpenSSL.create(nil);
IdHTTP := TIdHTTP.create(nil);
with IdSSLIOHandlerSocket1 do begin
SSLOptions.Method := sslvSSLv3;
SSLOptions.Mode := sslmUnassigned;
SSLOptions.VerifyMode := [];
SSLOptions.VerifyDepth := 2;
end;
with IdHTTP do begin
IOHandler := IdSSLIOHandlerSocket1;
ReadTimeout := 0;
AllowCookies := True;
ProxyParams.BasicAuthentication := False;
ProxyParams.ProxyPort := 0;
Request.ContentLength := -1;
Request.ContentRangeEnd := 0;
Request.ContentRangeStart := 0;
Request.ContentType := 'application/x-www-form-urlencoded';
request.host := 'https://www.google.com';
Request.Accept := 'text/html, */*';
Request.BasicAuthentication := False;
Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
HTTPOptions := [hoForceEncodeParams];
end;
Params.Add('scope=https://www.google.com/analytics/feeds/');
Params.Add('oauth_consumer_key=anonymous');
Params.Add('oauth_signature_method=HMAC-SHA1');
Params.Add('oauth_signature=wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D');
Params.Add('oauth_timestamp=137131200');
Params.Add('oauth_nonce=4572616e48616d6d65724c61686176');
showmessage(HTTPDecode(IdHTTP.Post('https://www.google.com/accounts/OAuthGetRequestToken',Params)));
end;
Soluzione
Guardate la datastring risposta (in cui è sollevata l'eccezione), che vi darà un motivo in più dettaglio per il problema.
Per esempio, cercando con il codice, ho ottenuto un "timestamp troppo lontano dal tempo attuale", poi, dopo l'aggiornamento del oauth_timestamp, ho ricevuto una "Firma non valida" ...
Altri suggerimenti
Controlla se si ottiene un messaggio di ritorno nella risposta intestazione , anche oltre i 400. La maggior parte dei servizi di web forniscono una sorta di descrizione testuale su ciò che sta andando male.
Verificare inoltre che la libreria OpenSSL viene effettivamente caricata, altrimenti Indy potrebbe fallback alla comunicazione non codificata, che il server potrebbe non accettare.
Prova il routing una richiesta tramite HTTP Fiddler .
Ho trovato che per essere un ottimo strumento per tracciare ciò che va storto su http / https livello.
- Jeroen