2012-08-14 36 views
3

嘗試創建new blog posting時,我不斷收到401 /未從Tumblr授權。在Tumblr上創建博客文章時OAuth失敗(繼續獲得401 /未授權)

這裏是HTTP流量的,我從我的網卡捕獲的序列:

從客戶端到的tumblr:

POST /v2/blog/topictastic.tumblr.com/post HTTP/1.1
授權:OAuth的oauth_consumer_key = 「s83rTQBomoPtl66AT0hEScmYM0QYdhlbW0sa5sRIojgeGOcAUr」,oauth_nonce = 「9313743」,oauth_signature_method = 「HMAC-SHA1」,oauth_timestamp = 「1344973847」,組oauth_token = 「kw5NdFnuJ8CLC4cMOMJ4YsKXtOApdw6IcSoPJlF5GZgHaWo9zy」,oauth_version = 「1.0」,oauth_signature =「FLStmGNNdfhQysKDtcKSWFBY%2F%2F4 %3D「
內容類型:應用/ X WWW的窗體-urlencoded
主機:api.tumblr.com
的Content-Length:130
期望值:100繼續
連接:保持活動

從響應的tumblr:

HTTP/1.1 100繼續

從客戶機到的tumblr:

類型=報價&報價=服用+輸入+在+ C%2B%2B +無+ +庫函數&源= HTTP%3A%2F%2fstackoverflow.com%2fquestions%2f11959696%2F

從的tumblr

響應:

HTTP/1.1 401未授權
日期:星期二,2012年8月14日十九點50分56秒GMT
服務器:Apache
P3P:CP = 「ALL ADM DEV PSAI COM OUR OTRO STP IND ONL」
有所不同:接受編碼
X-的tumblr-微秒:d = 293868
的Content-Length:60
連接:關閉
內容型:應用/ JSON
{ 「元」:{ 「狀態」:401, 「msg」 中: 「未授權」}, 「響應」:[]}

這是C#源代碼我用於生成併發布請求:

var baseHostName = request.Endpoint.Properties["base-hostname"]; 
var postUrl = string.Format("http://api.tumblr.com/v2/blog/{0}/post", baseHostName); 
using (var wc = new WebClient()) 
{ 
    var oauth = new OAuthBase(); 
    var consumerKey = request.ApplicationProperties["ConsumerKey"]; 
    var consumerSecret = request.ApplicationProperties["ConsumerSecret"]; 
    var oauthToken = request.Enrollment.Properties["oauth_token"]; 
    var oauthTokenSecret = request.Enrollment.Properties["oauth_token_secret"]; 
    var timestamp = oauth.GenerateTimeStamp(); 
    var nonce = oauth.GenerateNonce(); 
    string url, url2; 
    var values = new NameValueCollection(); 
    var type = request.Notification.Properties["type"]; 
    foreach (var property in request.Notification.Properties) 
    { 
     if (property.Key.StartsWith(type + ".")) 
     { 
      var tumblrPropertyName = property.Key.Replace(type + ".", string.Empty); 
      values.Add(tumblrPropertyName, property.Value); 
     } 
     else if (!property.Key.Contains(".")) 
     { 
      values.Add(property.Key, property.Value); 
     } 
    } 
    var postUri = new Uri(postUrl); 
    var signature = oauth.GenerateSignature(
     postUri, 
     consumerKey, 
     consumerSecret, 
     oauthToken, 
     oauthTokenSecret, 
     "POST", 
     timestamp, 
     nonce, 
     null, 
     out url, 
     out url2); 
    var urlEncodedSignature = oauth.UrlEncode(signature); 
    var authHeader = "OAuth " + url2 + "&oauth_signature=" + urlEncodedSignature + "\""; 
    authHeader = authHeader.Replace("&", "\", ").Replace("=", "=\""); 
    wc.Headers.Add("Authorization", authHeader); 
    try 
    { 
     wc.UploadValues(postUri, values); 
    } 
    catch (WebException webException) 
    { 
     var message = (new StreamReader(webException.Response.GetResponseStream())).ReadToEnd(); 
     throw new Exception(message, webException); 
    } 
} 

OAuthBase類是located here

我在運行此代碼的時候有一個有效的oauth_token和oauth_token_secret。 任何想法這有什麼問題嗎?爲什麼我一直得到401 /不authroized?

+0

你有沒有得到相同的分辨率?我面臨同樣的問題 – Kapil 2012-10-03 14:03:45

回答

0

有同樣的問題(但與iOS):它似乎像我使用的OAuth庫沒有使用POST數據字段的簽名。在將類型字段添加爲查詢字符串之後,OAuth庫使用它們,並且我能夠上傳照片/文章/其他內容。

似乎每個帖子正文字段(二進制數據除外)都需要成爲OAuth簽名的一部分。

0

它看起來像你需要改變你的編碼。例如,空格應該是「%20」而不是「+」符號!