3

新しいブログ投稿を作成しようとすると、Tumblr から 401/notauthorized が表示され続けます。

以下は、ネットワーク カードからキャプチャした一連の HTTP トラフィックです。

クライアントからTumblrへ:

POST /v2/blog/topictastic.tumblr.com/post HTTP/1.1
Authorization: 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"
Content-Type: application/x-www-form-urlencoded
Host: api.tumblr.com
Content-Length: 130
Expect: 100-continue
Connection:生き続ける

Tumblr からの応答:

HTTP/1.1 100 続行

クライアントからTumblrへ:

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

Tumblr からの応答:

HTTP/1.1 401 Not Authorized
Date: Tue, 14 Aug 2012 19:50:56 GMT
Server: Apache
P3P: CP="ALL ADM DEV PSAi COM OUR ORo STP IND ONL"
Vary: Accept-Encoding
X-Tumblr-Usec: D =293868
Content-Length: 60
Connection: close
Content-Type: application/json
{"meta":{"status":401,"msg":"Not Authorized"},"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クラスはここにあります

このコードを実行している時点で、有効な oauth_token と oauth_token_secret があります。これの何が問題なのですか?なぜ私は 401 を取得し続けるのですか?

4

2 に答える 2

0

同じ問題がありました (しかし iOS で): 私が使用した OAuth ライブラリは、署名に POST データ フィールドを使用していなかったようです。フィールドタイプキャプションをクエリ文字列として追加した後、OAuth ライブラリがそれらを使用し、写真/投稿/何でもアップロードできました。

すべての投稿本文フィールド (バイナリ データを除く) は、OAuth 署名の一部である必要があるようです。

于 2012-12-02T17:51:48.400 に答える
0

エンコーディングを変更する必要があるようです。たとえば、スペースは「+」記号ではなく「%20」にする必要があります。

于 2014-01-04T22:59:10.810 に答える