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;
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top