2

Overbyte の ICS スイートを使用して Instapaper API からアクセス トークンを取得できません。奇妙なことに、Indy を使用してアクセス トークンを取得できます。Delphi XE2 と ICS バージョン 7 を使用しています。

デバッグの目的で、投稿データと認証ヘッダーに固定文字列を使用しています。Indy コードが機能するため、問題は署名に関連していないようです。

これを ICS で機能させたいのですが...コードが機能しない理由について何か考えはありますか? 無効な署名エラーが発生しました (署名が期待値と一致しません)。認証ヘッダーと投稿本文は、Indy で送信しているものと同じである必要があるため、ICS 要求と関係があるようです。

これが機能するIndyコードです(oauth_tokenとoauth_token_secretが返されます)

var
  Params: TStringList;
  AuthHeader: STring;
  idHTTP: TIDHTTP;
  SSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
begin 
  idHTTP := TIDHTTP.Create(Self);
  SslIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
  idHTTP.IOHandler := SSLIOHandler;
  idHTTP.HTTPOptions := [];   
  Params := TStringList.Create;
  Params.Add('x_auth_mode=client_auth');
  Params.Add('x_auth_password=mypassword');
  Params.Add('x_auth_username=myusername%40gmail.com');
  idHTTP.Request.Host := 'https://www.instapaper.com';
  AuthHeader := 'Authorization: ' + 'OAuth oauth_consumer_key="myconsumerkey", oauth_nonce="BAFWMTGFXNXSTNKUENBC", oauth_signature_method="HMAC-SHA1", oauth_signature="sEfq8gHlHYfrmLy5u0kKBgTYmVA%3D", oauth_timestamp="1369669197", oauth_version="1.0"';
  idHTTP.request.CustomHeaders.Add(AuthHeader);
  Response := idHTTP.Post('https://www.instapaper.com/api/1/oauth/access_token', Params);
end;

失敗する ICS コードは次のとおりです (署名が無効です)。

var
  PostData: AnsiString;
begin
  PostData := 'x_auth_mode=client_auth&x_auth_password=mypassword&x_auth_username=myusername%40gmail.com';
  SSLHTTPClient := TSslHttpCli.Create(nil);
  With SSLHTTPClient do
  begin
    RcvdStream         := TMemoryStream.Create;
    SendStream         := TMemoryStream.Create;
    SendStream.Seek(0, soFromBeginning);
    SendStream.Write(PostData[1], Length(PostData));
    SendStream.Seek(0, soFromBeginning);
    URL                := 'https://www.instapaper.com/api/1/oauth/access_token';
    OnRequestDone      := SSLHTTPClientRequestDone;
    OnBeforeHeaderSend := HTTPClientBeforeHeaderSend;    // add the authorization header
    SslContext := TSslContext.Create(SSLHTTPClient);
    PostAsync;
  end;
end;

procedure TInstapaperOAuth.HTTPClientBeforeHeaderSend(Sender: TObject; const Method: string; Headers: TStrings);
var
  Header: String;
begin
  Header := 'Authorization: ' + 'OAuth oauth_consumer_key="myconsumerkey", oauth_nonce="BAFWMTGFXNXSTNKUENBC", oauth_signature_method="HMAC-SHA1", oauth_signature="sEfq8gHlHYfrmLy5u0kKBgTYmVA%3D", oauth_timestamp="1369669197", oauth_version="1.0"';
  Headers.Add(Header);
end;
4

1 に答える 1