在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之后,我得到了“无效签名”...
答
检查如果你在响应头返回消息,太,除了400大多数Web服务提供了什么错误某种文字描述的。
另外验证OpenSSL库是否实际加载,否则Indy可能会回退到服务器可能不接受的未编码通信。
谢谢!我在IdHTTP.pas中搜索数据字符串,放置一个断点并得到相同的第一个错误。会及时向大家发布。你是[email protected]? – 2009-10-16 13:49:01
尽管这并没有完全回答这个问题,但它的确提示我深入挖掘并查看对问题更详细的解释。最后,我决定使用AuthSub身份验证。我已经得到这个工作。 – 2009-10-19 15:56:50
很高兴你能用它!不,我不是FrançoisPiette ...... – 2009-10-20 16:34:23