在Delphi中使用Indy的Google OAuth

问题描述:

我在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; 

看那响应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

检查如果你在响应头返回消息,太,除了400大多数Web服务提供了什么错误某种文字描述的。

另外验证OpenSSL库是否实际加载,否则Indy可能会回退到服务器可能不接受的未编码通信。

尝试通过HTTP Fiddler路由您的请求。

我发现这是一个很好的工具,可以跟踪http/https级别的问题。

--jeroen