【问题标题】:OAuth Failing when Creating Blog Post on Tumblr (Keep getting 401/not authorized)在 Tumblr 上创建博客文章时 OAuth 失败(不断收到 401/未授权)
【发布时间】:2012-08-11 04:35:09
【问题描述】:

在尝试创建 new blog posting 时,我不断收到 401 / 未经 Tumblr 授权。

这是我从网卡捕获的 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-继续
连接:保持活动

来自 Tumblr 的回应:

HTTP/1.1 100 继续

从客户到 Tumblr:

type=quote&quote=Taking+Input+in+C%2b%2b+without+Library+Functions&source=http%3a%2f%2fstackoverflow.com%2fquestions%2f11959696%2f

来自 Tumblr 的回应:

HTTP/1.1 401 未授权
日期:格林威治标准时间 2012 年 8 月 14 日星期二 19:50:56
服务器:阿帕奇
P3P:CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL"
变化:接受编码
X-Tumblr-Usec:D=293868
内容长度:60
连接:关闭
内容类型:应用程序/json
{"meta":{"status":401,"msg":"未授权"},"response":[]}

这是我用来生成和发布请求的 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/未授权?

【问题讨论】:

  • 你有同样的解决方案吗?我也面临同样的问题

标签: c# .net oauth tumblr


【解决方案1】:

您似乎需要更改编码。例如空格应该是“%20”而不是“+”符号!

【讨论】:

    【解决方案2】:

    遇到了同样的问题(但在 iOS 上):我使用的 OAuth 库似乎没有使用 POST Data 字段进行签名。在我添加字段 typecaption 作为查询字符串后,OAuth 库使用它们,我能够上传照片/帖子/任何内容。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 2011-11-27
      • 2012-04-08
      相关资源
      最近更新 更多