2009-10-15 5 views
3

J'utilise Indy10 avec Delphi et j'essaie de faire fonctionner Google's OAuth. La première étape consiste à faire une requête à la méthode OAuthGetRequestToken. Le code ci-dessous renvoie une erreur 400. Toute aide serait grandement appréciée.Google OAuth avec Indy en Delphi

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; 

Répondre

1

Regardez le datastring de réponse (où l'exception est levée), il vous donnera une raison de plus de détails pour le problème. Par exemple, en essayant avec votre code, j'ai d'abord obtenu un "horodatage trop loin de l'heure actuelle", puis après la mise à jour de l'oauth_timestamp, j'ai obtenu une "Signature invalide" ...

+0

Merci! J'ai cherché le datastring dans IdHTTP.pas, j'ai mis un breakpoint et j'ai eu la même première erreur. Vous tiendrons au courant. Êtes-vous [email protected] ???? –

+0

Bien que cela n'ait pas totalement répondu à la question, cela m'a incité à creuser plus profondément et à voir une explication plus détaillée du problème. À la fin, j'ai décidé d'utiliser l'authentification AuthSub. J'ai réussi à faire ça. –

+0

Je suis content que vous l'ayez fait fonctionner! Non, je ne suis pas François Piette ... –

1

Vérifiez si vous obtenez un message de retour dans l'en-tête de réponse aussi, en plus des 400. La plupart des services Web offrent une sorte de description textuelle sur ce qui se passe mal.

Vérifiez également que la bibliothèque OpenSSL est réellement chargée, sinon Indy peut se replier sur une communication non codée, ce que le serveur pourrait ne pas accepter.

1

Essayez d'acheminer votre demande via HTTP Fiddler.

J'ai trouvé que c'était un excellent outil pour tracer ce qui ne va pas au niveau http/https.

--jeroen

Questions connexes