1

何が間違っているのかわかりませんが、それはおそらく、oauth を使用した最初のタンゴであり、どこかでそれを新規作成していると確信しているためです。私は現在、Google コードによってホストされ、oauth の Web サイト (http://oauth.googlecode.com/svn/code/csharp/) にリンクされている oauth ライブラリを使用しています。

次のコードでは、変数「YQL」は、クラスのスコープ内で次のように保護されていると宣言されている「OAuthBase」オブジェクトです。

private OAuthBase YQL;

次のように初期化されます。

public AverageEverydayConstructor()
{
     ...
     YQL = new OAuthBase();
     ...
}

そして、ここで実際の非機能がすべて発生します (文字列 "key" は私のコンシューマー キーであり、"secret" は私のコンシューマー シークレットです)。

 private string yahooRetrieveToken(string key, string secret)
    {
        string tokenRequestUrl = @"https://api.login.yahoo.com/oauth/v2/get_request_token";
        string parameters = "";

        string timestamp = YQL.GenerateTimeStamp();
        string nonce = YQL.GenerateNonce();

        parameters += "?oauth_nonce=" + nonce;
        parameters += "&oauth_timestamp=" + timestamp;
        parameters += "&oauth_consumer_key=" + key;
        parameters += "&oauth_signature_method=HMAC-SHA1";
        parameters += "&oauth_signature=" + secret;
        parameters += "&oauth_version=1.0";
        parameters += "&xoauth_lang_pref=en-us";
        parameters += "&oauth_callback=\"oob\"";


        string fullUrl = tokenRequestUrl + parameters;
        Clipboard.SetText(fullUrl);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(fullUrl);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse(); //this is the line that actually err's with 401.
        Stream result = response.GetResponseStream();

        //And yes, I'm aware I'm not using very good practice and haven't properly closed the stream. I'm just trying to get it to work first, but don't worry I haven't forgotten.


        string unparsedResult = result.ToString();
        return unparsedResult;
    }

私は考えられるすべてを試し、このページ (http://developer.yahoo.com/oauth/guide/oauth-requesttoken.html) を何十回も調べました。すべてのベースをカバーしていることを確認するために、以下の 2 行を前後に変更してみました。変更があるかどうかを確認してください。

        parameters += "&oauth_signature_method=PLAINTEXT";
        parameters += "&oauth_signature=" + secret + "%26";

ありがとう!

4

1 に答える 1

2

したがって、なぜこれが機能したのか正確にはわかりません。私の質問は、(私が知る限り) YQL のドキュメント仕様に正確に沿ったものでした。POST リクエストを作成する代わりに、GET リクエストを作成し、リクエストのヘッダーですべてを実行しました。これに基づいています: 401 Unauthorized using Yahoo OAuth

彼がしたことが彼にはうまくいかなかったが、私にはうまくいった理由はわかりません。いずれにせよ、これが機能した結果のコードです。実際にトークンを取得することはできませんでしたが、YQL リクエストを作成することはできました。

/// <summary>
/// Make a YQL query and return an unformated xml string
/// </summary>
/// <param name="key">Application Consumer Key</param>
/// <param name="secret">Application Consumer Secret</param>
/// <param name="query">The YQL query you want to run</param>
/// <returns>Returns formatted xml in the form of a string from YQL</returns>
protected string yqlQuery(string key, string secret, string query)
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(@"http://query.yahooapis.com/v1/yql?q=" + query);
    OAuthBase YQL = new OAuthBase();
    string nonce = YQL.GenerateNonce();
    string timestamp = YQL.GenerateTimeStamp();
    request.Headers.Add(
        "Authorization: OAuth " +
        "realm=\"yahooapis.com\"," +
        "oauth_consumer_key=\"" + key + "\"," +
        "oauth_nonce=\"" + nonce + "\"," +
        "oauth_signature_method=\"PLAINTEXT\"," +
        "oauth_timestamp=\"" + timestamp + "\"," +
        "oauth_version=\"1.0\"," +
        "oauth_signature=\"" + secret + "%26\""
    );
    string resultString = "";
    using (StreamReader read = new StreamReader(request.GetResponse().GetResponseStream(), true))
    {
        resultString = read.ReadToEnd();
    }
    return resultString;
}
于 2012-11-03T03:18:46.873 に答える