2012-02-17 7 views
5

自分で作成したいデモアプリケーション用のFlickr APIを認証しようとしています。次に、私はFlick APIについて学ぶ新しい機能を使ってこのアプリを拡張します。Flickr APIへの署名リクエストのシグネチャが無効です(コンソールのシミュレーション)

これはちょうど私が遊びたいものです。しかし、今はリクエストトークンを取得するのにいくつか問題があります。

は、私がここにFlickrの認証のドキュメントを次のようだ:Flickr Authentication
、私はまた見つけ、このMathlabscript:これらのソースに基づいてFlickr API with OAuth-based user authentication

だから私持っている今、次のコンソールアプリケーション:

class Program 
{ 
    private static string Secret = "2b2b2b2b2b2b2b2b2b"; 
    private static string ConsumerKey = "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a"; 

    static void Main(string[] args) 
    { 
     Random rand = new Random(); 

     string nonce = rand.Next(9999999).ToString(); 
     string timestamp = ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString(); 

     Console.WriteLine("Nonce: " + nonce); 
     Console.WriteLine("TimeStamp: " + timestamp); 

     Console.WriteLine("ConsumerKey: " + ConsumerKey); 
     Console.WriteLine("AppSecret: " + Secret); 

     //request url 
     StringBuilder b = new StringBuilder(); 
     b.Append("http://www.flickr.com/services/oauth/request_token"); 
     b.Append("?"); 
     b.Append("oauth_nonce="); 
     b.Append(nonce); 
     b.Append("&oauth_timestamp="); 
     b.Append(timestamp); 
     b.Append("&oauth_consumer_key="); 
     b.Append(ConsumerKey); 
     b.Append("&oauth_callback=oob"); 
     b.Append("&oauth_signature_method=HMAC-SHA1"); 

     string requesturl = b.ToString(); 
     Console.WriteLine("RequestUrl: " + requesturl); 

     //base url 
     string basestring; 
     StringBuilder bs = new StringBuilder(); 

     bs.Append("GET&"); 
     bs.Append(UrlHelper.Encode("http://www.flickr.com/services/oauth/request_token")+"&"); 
     basestring = bs.ToString(); 

     StringBuilder p = new StringBuilder(); 
     p.Append("oauth_callback=oob"); 
     p.Append("&oauth_consumer_key="); 
     p.Append(ConsumerKey); 
     p.Append("oauth_nonce="); 
     p.Append(nonce); 
     p.Append("&oauth_signature_method=HMAC-SHA1"); 
     p.Append("&oauth_timestamp="); 
     p.Append(timestamp); 

     string paramers = UrlHelper.Encode(p.ToString()); 

     basestring += paramers; 
     Console.WriteLine("Basestring: " + basestring); 



     System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 

     string key = Secret + "&"; 
     Console.WriteLine("Key: " + key); 

     byte[] keyByte = encoding.GetBytes(key); 

     //--create message to encrypt 
     byte[] messageBytes = encoding.GetBytes(basestring); 

     //--encrypt message using hmac-sha1 with the provided key 
     HMACSHA1 hmacsha1 = new HMACSHA1(keyByte); 
     byte[] hashmessage = hmacsha1.ComputeHash(messageBytes); 

     //--signature 
     string signature = ByteToString(hashmessage); 
     Console.WriteLine("Signature: " + signature); 

     Console.WriteLine("Final Request: " + requesturl + "&oauth_signature=" + signature); 


     Console.ReadKey(true); 



    } 
    public static string ByteToString(byte[] buff) 
    { 
     string sbinary = ""; 

     for (int i = 0; i < buff.Length; i++) 
     { 
      sbinary += buff[i].ToString("X2"); // hex format 
     } 
     return (sbinary); 
    } 
} 

このアプリケーションが私に与えるURLを参照すると、次の応答が得られます。

oauth_problem=signature_invalid&debug_sbs=GET&http%3A%2F%2Fwww.flickr.com%2Fservices%2Foauth%2Frequest_token&oauth_callback%3Dhttp%253A%252F%252Fwww.google.be%26oauth_consumer_key%3D1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a%26oauth_nonce%3D27504343%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1329469580 

リクエストに対する私の署名が無効であるようです。

私は、誰かがこれらの要求に対して正しい署名を得るのを助けてくれることを願っています。

私はFlickNetライブラリが既に開発者のほとんどのために大変な仕事をしていることを知っていますが、私はこれも有効にすることが有用かもしれないと思います。私はFlickrNetのソースコードを調べましたが、このコードを完成させるための最終的な平和は見つかりませんでした。

私を助けることができるかどうか教えてください。それはとても素晴らしいだろう!

ありがとうございます!

+0

自分自身への注意:oauth認証の詳細については、こちらを参照してください。http://hueniverse.com/oauth/guide/authentication/できるだけ早くこれを見てください:) – ThdK

答えて

9

私はようやく答えを見つけました。 oauthのリクエストに署名する際に留意しなければならないことがいくつかあります。

  1. (使用している場合)署名が暗号化されるテキストとclientsecretとtoken_secretとして(nr.2を参照)basestringを使用してHMAC-SHA1で暗号化されなければならない(NRを参照してください。3)
  2. basestring = [HTTPMETHOD] & [FlickrAPIEndpoint] & [パラメータ]要求oauth_tokenため
  3. キー= [ApiSecret] & (またはキー= [ApiSecret] & [Oauth_token_secret]要求access_tokenは用)

重要:FlickrAPIEndPointとParametersはUrlEncodedにする必要があります(2つの部分で!) HttpUtility.UrlEncodeメソッドでは大文字のエンコーディングを使用する必要があるため、別のクラスを使用しています。

重要:パラメータはアルファベット順にする必要があります。

リクエストトークンとリクエストトークンシークレットの署名付きリクエストを作成するコンソールアプリケーションのコードです。イアン・ホプキンスによって

class Program 
{ 
    private static string Secret = "9dcc18a121e9a02e"; 
    private static string ConsumerKey = "3aafc63ec6b05f3f9a9ff3a1c35ce541"; 
    private static string request_token = ""; 

    static void Main(string[] args) 
    { 

     string requestString = "http://www.flickr.com/services/oauth/request_token"; 

     //generate a random nonce and a timestamp 
     Random rand = new Random(); 
     string nonce = rand.Next(999999).ToString(); 
     string timestamp = GetTimestamp(); 

     //create the parameter string in alphabetical order 
     string parameters = "oauth_callback=" + UrlHelper.Encode("http://www.example.com"); 
     parameters += "&oauth_consumer_key=" + ConsumerKey; 
     parameters += "&oauth_nonce=" + nonce; 
     parameters += "&oauth_signature_method=HMAC-SHA1"; 
     parameters += "&oauth_timestamp=" + timestamp; 
     parameters += "&oauth_version=1.0"; 

     //generate a signature base on the current requeststring and parameters 
     string signature = generateSignature("GET", requestString, parameters); 

     //add the parameters and signature to the requeststring 
     string url = requestString + "?" + parameters + "&oauth_signature=" + signature; 

     //test the request 
     WebClient web = new WebClient(); 
     string result = web.DownloadString(url); 

     Console.WriteLine("Flickr Response: "); 
     Console.WriteLine(result); //contains the oauth_token and the oauth_token_secret 
     Console.ReadKey(true); 

    } 

    private static string generateSignature(string httpMethod, string ApiEndpoint, string parameters) 
    { 
     //url encode the API endpoint and the parameters 

     //IMPORTANT NOTE: 
     //encoded text should contain uppercase characters: '=' => %3D !!! (not %3d) 
     //the HtmlUtility.UrlEncode creates lowercase encoded tags! 
     //Here I use a urlencode class by Ian Hopkins 
     string encodedUrl = UrlHelper.Encode(ApiEndpoint); 
     string encodedParameters = UrlHelper.Encode(parameters); 

     //generate the basestring 
     string basestring = httpMethod + "&" + encodedUrl + "&"; 
     parameters = UrlHelper.Encode(parameters); 
     basestring = basestring + parameters; 

     //hmac-sha1 encryption: 

     System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 

     //create key (request_token can be an empty string) 
     string key = Secret + "&" + request_token; 
     byte[] keyByte = encoding.GetBytes(key); 

     //create message to encrypt 
     byte[] messageBytes = encoding.GetBytes(basestring); 

     //encrypt message using hmac-sha1 with the provided key 
     HMACSHA1 hmacsha1 = new HMACSHA1(keyByte); 
     byte[] hashmessage = hmacsha1.ComputeHash(messageBytes); 

     //signature is the base64 format for the genarated hmac-sha1 hash 
     string signature = System.Convert.ToBase64String(hashmessage); 

     //encode the signature to make it url safe and return the encoded url 
     return UrlHelper.Encode(signature); 

    } 

    //generator of unix epoch time 
    public static String GetTimestamp() 
    { 
     int epoch = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; 
     return epoch.ToString(); 
    } 

} 

UrlHelperクラスは、私はflickrnetライブラリをダウンロードしたURLエンコード

/// <summary> 
    /// URL encoding class. Note: use at your own risk. 
    /// Written by: Ian Hopkins (http://www.lucidhelix.com) 
    /// Date: 2008-Dec-23 
    /// (Ported to C# by t3rse (http://www.t3rse.com)) 
    /// </summary> 
    public class UrlHelper 
    { 
     public static string Encode(string str) 
     { 
      var charClass = String.Format("0-9a-zA-Z{0}", Regex.Escape("-_.!~*'()")); 
      return Regex.Replace(str, 
       String.Format("[^{0}]", charClass), 
       new MatchEvaluator(EncodeEvaluator)); 
     } 
    public static string EncodeEvaluator(Match match) 
    { 
     return (match.Value == " ") ? "+" : String.Format("%{0:X2}", Convert.ToInt32(match.Value[0])); 
    } 

    public static string DecodeEvaluator(Match match) 
    { 
     return Convert.ToChar(int.Parse(match.Value.Substring(1), System.Globalization.NumberStyles.HexNumber)).ToString(); 
    } 

    public static string Decode(string str) 
    { 
     return Regex.Replace(str.Replace('+', ' '), "%[0-9a-zA-Z][0-9a-zA-Z]", new MatchEvaluator(DecodeEvaluator)); 
    } 
} 
+0

! –

1

あなたは一から書いていますか?もしそうなら、あなたはすべきではありません。代わりにhttp://flickrnet.codeplex.com/を使用してください。この図書館はすでにあなたのために重労働をしています。

+1

のために使用さが、私はそれが何をするかを理解したかったです。非常に小さなアプリでは、Flickr APIに1つまたはほんの少しのリクエストをする必要があるだけなので、自分で書くことができると思っていたからです。 (私はFacebook APIのために昨年も同じことをしました) – ThdK

+1

@ThomasDekiereソースコードはcodeplexにありますので、ダウンロードしてソースをブラウズすることで何ができるか分かります。 – Jeff

+0

私はもう少し先に研究をする必要があったようです。私は必要な情報を見つけることなく、flickrnetのソースコードを検索しました。さて、すべての種類のプログラミング言語で多くのサンプルを読んだ後、私はflickr APIへのリクエストの作成をシミュレートするコンソールアプリケーションを作成しました。しかし、私は無効な署名メッセージを取得します。私はすべての情報と私が持っているコードでここに新しい質問を作成しました:http://stackoverflow.com/questions/9330004/invalid-signature-for-signing-requests-to-the-flickr-api-simulation-in -console – ThdK

関連する問題