首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Delphi中获取Instapaper访问令牌

从Delphi中获取Instapaper访问令牌
EN

Stack Overflow用户
提问于 2013-05-28 01:22:30
回答 1查看 2K关注 0票数 2

我在使用Overbyte的ICS套件从Instapaper获取访问令牌时遇到了问题。奇怪的是,我可以使用Indy获得访问令牌。我使用的是Delphi XE2和ICS version7。

出于调试目的,我对post数据和授权头使用固定的字符串。由于Indy代码可以正常工作,因此问题似乎与签名无关。

我想让这与ICS的工作…关于代码为什么不能工作,你有什么想法吗?我收到一个无效签名错误(签名与预期值不匹配)。authorization头和post正文应该与我用Indy发送的内容相同,所以听起来像是与ICS请求有关。

下面是可以工作的Indy代码(我得到了oauth_token和oauth_token_secret )

代码语言:javascript
复制
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代码(签名无效):

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-14 04:50:20

我接受上面的评论作为这个问题的答案。因此,要解决此问题,请更新HTTPClientBeforeHeaderSend以替换主机记录,并添加oauth头:

代码语言:javascript
复制
procedure TInstapaperOAuth.HTTPClientBeforeHeaderSend(Sender: TObject; const Method: string; Headers: TStrings);
var
  Header: String;
  I: Integer;
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);

  //=======================================
  //  find the host record and replace it
  //=======================================
  for I := 0 to Headers.Count - 1 do
  begin
    if pos('Host:',Headers.Strings[I]) > 0 then
    begin
      Headers.Strings[I] := 'Host: www.instapaper.com';
      break;
    end;
  end;
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16777859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档