![](/img/trans.png)
[英]Twitter Oauth Delphi 7 home_timeline getting 401 unauthorized
[英]Twitter - Could not authenticate with OAuth (401) Error
所以,我在Delphi中做一個簡單的twitter應用程序,因為找不到已經可以使用的庫,所以我決定創建自己的庫。 通過身份驗證過程,我將遵循所有步驟並獲得訪問令牌和秘密令牌。
當我嘗試使用它們(在以下代碼中)時,出現錯誤{“ error”:“無法通過OAuth進行身份驗證。”}
對於讀寫請求(驗證和發布)都是如此。 任何幫助都將不勝感激,因為我一直在這方面將頭撞牆。
下面代碼中的命令是注釋正上方變量的內容。
編輯:即使只是知道什么原因可能會導致“無法使用OAuth進行身份驗證”,而不是更具體的錯誤(“無效簽名”,“缺少參數”)也會有很大幫助!
編輯2:Wireshark數據包結果。
HTTP/1.1 401 Unauthorized
Date: Tue, 06 Sep 2011 20:11:13 GMT
Server: hi
Status: 401 Unauthorized
WWW-Authenticate: OAuth realm="http://api.twitter.com"
X-Runtime: 0.01306
Content-Type: application/json; charset=utf-8
Content-Length: 114
Cache-Control: no-cache, max-age=300
Set-Cookie: _twitter_sess=xxxxxxxxxxx; domain=.twitter.com; path=/; HttpOnly
Expires: Tue, 06 Sep 2011 20:16:13 GMT
Vary: Accept-Encoding
Connection: close
{"error":"Could not authenticate with OAuth.","request":"\/1\/statuses\/update.json?status=This%20is%20a%20test."}
碼:
function TTwitter.SendRequest(Method: String; URI: String; Params: Array of String): ISuperObject;
const
AuthHeaderFormat = 'OAuth oauth_nonce="%s", oauth_signature_method="%s", oauth_timestamp="%s", oauth_consumer_key="%s", oauth_token="%s", oauth_signature="%s", oauth_version="%s"';
var
oauth_nonce,
oauth_timestamp,
SignKey,
BaseString,
Signature,
AuthHeader,
ResponseStr : String;
BaseStringParams : Array of String;
JSON : ISuperObject;
I, J : Integer;
EmptyParams : TStringList;
begin
oauth_nonce := GenerateNonce;
oauth_timestamp := GenerateTimeStamp;
SignKey := fConsumerSecret + '&' + fAccessToken;
J := 0;
SetLength(BaseStringParams, Length(Params) + 6);
For I := Low(Params) To High(Params) Do
begin
BaseStringParams[J] := Params[I];
Inc(J);
end;
BaseStringParams[J] := 'oauth_consumer_key=' + fConsumerKey;
BaseStringParams[J + 1] := 'oauth_nonce=' + oauth_nonce;
BaseStringParams[J + 2] := 'oauth_signature_method=' + oauth_signature_method;
BaseStringParams[J + 3] := 'oauth_token=' + fOAuthToken;
BaseStringParams[J + 4] := 'oauth_timestamp=' + oauth_timestamp;
BaseStringParams[J + 5] := 'oauth_version=' + oauth_version;
BaseString := CreateBaseString('POST', URI, BaseStringParams);
//POST&http%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.json&oauth_consumer_key%3DXXXXXXXXXXXXXXXX%26oauth_nonce%3D0F95A680F2231F689C702FCECAD1D449%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1314988258%26oauth_token%3DXXXXXX-XXXXXXXXXXXXXXXX%26oauth_version%3D1.0%26status%3DThis%2520is%2520a%2520test.
AuthHeader := Format(AuthHeaderFormat, [oauth_nonce,
oauth_signature_method,
oauth_timestamp,
fConsumerkey,
fOAuthToken,
Signature,
oauth_version]);
//OAuth oauth_nonce="0F95A680F2231F689C702FCECAD1D449", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1314988258", oauth_consumer_key="XXXXXXXXXXXXXXXXXX", oauth_token="XXXXXX-XXXXXXXXXXXXXXXX", oauth_signature="XXXXXXXXXXXXXXXXXXXXX", oauth_version="1.0"
fHTTP.Request.CustomHeaders.AddValue('Authorization', AuthHeader);
EmptyParams := TStringList.Create;
Try
If Length(Params) > 0 Then
begin
URI := URI + '?';
For I := Low(Params) To High(Params) Do
begin
URI := URI + Params[I] + '&';
end;
URI := Copy(URI, 1, Length(URI) - 1);
//http://api.twitter.com/1/statuses/update.json?status=This%20is%20a%20test.
end;
If Method = 'POST' Then
begin
ResponseStr := fHTTP.Post(URI, EmptyParams);
end
Else If Method = 'GET' Then
begin
ResponseStr := fHTTP.Get(URI);
end;
JSON := SO(ResponseStr);
Result := JSON;
Except
On E:EIdHTTPProtocolException Do
begin
MessageBox(0, PChar(E.ErrorMessage), '', 0);
//{"error":"Could not authenticate with OAuth.","request":"\/1\/statuses\/update.json?status=This%20is%20a%20test."}
end;
end;
EmptyParams.Free;
end;
所以我發現在這一行:
fHTTP.Request.CustomHeaders.AddValue('Authorization', AuthHeader);
組件處理自定義標頭的方式是,文本的定界符為逗號。 這意味着程序在我為OAuth包含的每個參數之后都添加了\\ r \\ n(換行)。 難怪它失敗了! Twitter甚至沒有收到參數!
由於我在將標題添加到標題之前先檢查了標題,所以我什至都不認為這是問題所在。
謝謝您的幫助! 否則,我可能不會深入研究代碼。
我做了一個簡單的庫/類來發送狀態更新(發布消息):
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.