2009-10-15 84 views
3

我在Delphi中使用Indy10並試圖讓Google's OAuth工作。第一步是向OAuthGetRequestToken方法發出請求。下面的代碼返回400錯誤。任何幫助將不勝感激。在Delphi中使用Indy的Google OAuth

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; 

回答

1

看那響應DataString(其中引發異常),它會給你對這個問題的詳細原因。
例如,試着用你的代碼,我第一次得到一個「時間戳離當前時間太遠」,然後在更新oauth_timestamp之後,我得到了「無效簽名」...

+0

謝謝!我在IdHTTP.pas中搜索數據字符串,放置一個斷點並得到相同的第一個錯誤。會及時向大家發佈。你是[email protected]? – 2009-10-16 13:49:01

+0

儘管這並沒有完全回答這個問題,但它的確提示我深入挖掘並查看對問題更詳細的解釋。最後,我決定使用AuthSub身份驗證。我已經得到這個工作。 – 2009-10-19 15:56:50

+0

很高興你能用它!不,我不是FrançoisPiette ...... – 2009-10-20 16:34:23

1

檢查如果你在響應頭返回消息,太,除了400大多數Web服務提供了什麼錯誤某種文字描述的。

另外驗證OpenSSL庫是否實際加載,否則Indy可能會回退到服務器可能不接受的未編碼通信。

1

嘗試通過HTTP Fiddler路由您的請求。

我發現這是一個很好的工具,可以跟蹤http/https級別的問題。

--jeroen