gpt4 book ai didi

delphi - 从 Delphi 获取 Instapaper OAuth 访问 token

转载 作者:行者123 更新时间:2023-12-01 17:01:09 26 4
gpt4 key购买 nike

我在使用 Overbyte 的 ICS 套件从 Instapaper api 获取访问 token 时遇到问题。奇怪的是我能够使用 Indy 获得访问 token 。我正在使用 Delphi XE2 和 ICS 版本 7。

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

我想让它与 ICS 一起工作...关于为什么代码不起作用有什么想法吗?我收到无效签名错误(签名与预期值不匹配)。授权 header 和帖子正文应该与我使用 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;

最佳答案

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

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;

关于delphi - 从 Delphi 获取 Instapaper OAuth 访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16777859/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com