4

Delphi で Indy10 を使用しており、 Google の OAuthを機能させようとしています。最初のステップは、OAuthGetRequestToken メソッドへのリクエストを行うことです。以下のコードは 400 エラーを返します。どんな助けでも大歓迎です。

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;
4

3 に答える 3

2

400 に加えて、応答ヘッダーにも戻りメッセージが返されるかどうかを確認してください。ほとんどの Web サービスでは、問題の原因について何らかのテキストによる説明が提供されています。

また、OpenSSL ライブラリが実際にロードされていることを確認してください。そうしないと、Indy がエンコードされていない通信にフォールバックし、サーバーが受け入れない可能性があります。

于 2009-10-15T06:28:10.713 に答える
2

応答の DataString (例外が発生した場所) を確認すると、問題の詳細な理由がわかります。
たとえば、コードを試してみると、最初に「タイムスタンプが現在の時刻から遠すぎます」が表示され、次に oauth_timestamp を更新した後、「無効な署名」が表示されました...

于 2009-10-15T21:06:47.987 に答える
2

HTTP Fiddlerを介してリクエストをルーティングしてみてください。

http/https レベルで何が問題なのかを追跡するための優れたツールであることがわかりました。

--jeroen

于 2009-10-15T08:23:09.490 に答える