Google OAuth avec Indy en Delphi
Question
J'utilise Indy10 avec Delphi et essayer d'obtenir de OAuth Google travailler. La première étape consiste à faire une demande à la méthode OAuthGetRequestToken. Le code retourne en dessous d'une erreur 400. Toute aide serait grandement appréciée.
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;
La solution
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, je suis arrivé un « horodatage trop loin de temps en cours », puis après la mise à jour du oauth_timestamp, je suis un « Signature non valide » ...
Autres conseils
Vérifiez si vous obtenez un message de retour dans la 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 effectivement chargée, sinon Indy pourrait fallback à la communication non codée, que le serveur peut ne pas accepter.
Essayez de routage de votre demande par HTTP Fiddler .
Je trouve que pour être un excellent outil pour tracer ce qui va mal au niveau http / https.
- jeroen