在Tumblr上创建博客帖子时OAuth失败(继续获得401 /未授权)

时间:2012-08-14 20:01:57

标签: c# .net oauth tumblr

在尝试创建new blog posting时,我一直从Tumblr获得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“
  内容类型:application / x-www-form-urlencoded
  主持人:api.tumblr.com
  内容长度:130
  期待:100-继续
  连接:Keep-Alive

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日星期二19:50:56 GMT
  服务器:Apache
  P3P:CP =“所有ADM DEVi CO​​MIN COM OTRo STP IND ONL”
  变化:接受编码
  X-Tumblr-Usec:D = 293868
  内容长度:60
  连接:关闭
  内容类型:application / json
  {“meta”:{“status”: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 /不被授权?

2 个答案:

答案 0 :(得分:0)

有同样的问题(但是使用iOS):我使用的OAuth库似乎没有使用POST数据字段进行签名。在我添加字段类型标题作为查询字符串之后,OAuth库使用了它们,我能够上传照片/帖子/其他。

似乎每个帖子正文字段(二进制数据除外)都需要成为OAuth签名的一部分。

答案 1 :(得分:0)

看起来您需要更改编码。例如,空格应为"%20"而不是" +"符号!

相关问题