private string GenerateSignature(string resourceUrl, TKMethod method, string oauthNonce, string oauthTimestamp, SortedDictionary <string, string> requestParameters) { // パラメータ集合にoauth用の値を加える。 requestParameters.Add("oauth_consumer_key", consumerKey); requestParameters.Add("oauth_nonce", oauthNonce); requestParameters.Add("oauth_signature_method", OauthSignatureMethod); requestParameters.Add("oauth_timestamp", oauthTimestamp); requestParameters.Add("oauth_token", accessToken); requestParameters.Add("oauth_version", OauthVersion); var sigBaseString = ToWebString(requestParameters); /* * method と url と パラメータ列を&で結合 */ var signatureBaseString = string.Concat( method.ToString(), "&", Uri.EscapeDataString(resourceUrl), "&", Uri.EscapeDataString(sigBaseString) ); // consumer secret と access secret を結合、 var compositeKey = string.Concat(Uri.EscapeDataString(consumerKeySecret), "&", Uri.EscapeDataString(accessTokenSecret)); var oauthSignature = string.Empty; using (var hasher = new HMACSHA1(Encoding.ASCII.GetBytes(compositeKey))) { oauthSignature = Convert.ToBase64String( hasher.ComputeHash(Encoding.ASCII.GetBytes(signatureBaseString))); } return(oauthSignature); }
/* * 与えられたTwitter API urlに対し、指定したHTTPメソッドでアクセスを行う。 */ public IEnumerator GenerateAccessCoroutine( string resourceUrl, TKMethod method, SortedDictionary <string, string> urlQueryParameters, SortedDictionary <string, string> bodyParameters, Action <string, int, Dictionary <string, string>, string> succeeded, Action <string, int, TwitterAPI.APIError, Dictionary <string, string> > failed ) { if (urlQueryParameters == null) { urlQueryParameters = new SortedDictionary <string, string>(); } if (bodyParameters == null) { bodyParameters = new SortedDictionary <string, string>(); } /* * collect all parameters. */ var allParameters = new SortedDictionary <string, string>(); foreach (var item in urlQueryParameters) { allParameters[item.Key] = item.Value; } foreach (var item in bodyParameters) { allParameters[item.Key] = item.Value; } var oauthNonce = GenerateNonce(); var oauthTimestamp = GenerateTimestamp(); var oauthSignature = GenerateSignature(resourceUrl, method, oauthNonce, oauthTimestamp, allParameters); /* * generate authorization header. */ const string headerFormat = "OAuth oauth_consumer_key=\"{0}\", oauth_nonce=\"{1}\", " + "oauth_signature=\"{2}\", oauth_signature_method=\"{3}\", " + "oauth_timestamp=\"{4}\", oauth_token=\"{5}\", " + "oauth_version=\"{6}\""; var authHeader = string.Format(headerFormat, Uri.EscapeDataString(consumerKey), Uri.EscapeDataString(oauthNonce), Uri.EscapeDataString(oauthSignature), Uri.EscapeDataString(OauthSignatureMethod), Uri.EscapeDataString(oauthTimestamp), Uri.EscapeDataString(accessToken), Uri.EscapeDataString(OauthVersion) ); // Debug.Log("authHeader:" + authHeader); var reqCon = new TKHTTPConnection(); IEnumerator requestCor = null; switch (method) { case TKMethod.GET: { requestCor = reqCon.Get( "twitterCon_Get_" + Guid.NewGuid().ToString(), new Dictionary <string, string> { { "Authorization", authHeader } }, resourceUrl + GenerateQueryParameters(urlQueryParameters), succeeded, (conId, code, reason, response) => { TwitterAPI.APIError error = null; try { error = JsonUtility.FromJson <TwitterAPI.APIError>(reason); } catch { error = new TwitterAPI.APIError() { errors = new TwitterAPI.APIError.Error[1] { new TwitterAPI.APIError.Error() { code = code, message = reason } } }; } failed(conId, code, error, response); } ); break; } case TKMethod.POST: { var pairArray = new List <string>(); foreach (var pair in bodyParameters) { var kv = "\"" + pair.Key + "\":\"" + pair.Value + "\""; pairArray.Add(kv); } var data = "{" + string.Join(",", pairArray.ToArray()) + "}"; requestCor = reqCon.Post( "twitterCon_Post_" + Guid.NewGuid().ToString(), new Dictionary <string, string> { { "Authorization", authHeader }, }, resourceUrl + GenerateQueryParameters(bodyParameters), data, succeeded, (conId, code, reason, response) => { TwitterAPI.APIError error = null; try { error = JsonUtility.FromJson <TwitterAPI.APIError>(reason); } catch { error = new TwitterAPI.APIError() { errors = new TwitterAPI.APIError.Error[1] { new TwitterAPI.APIError.Error() { code = code, message = reason } } }; } failed(conId, code, error, response); } ); break; } } while (requestCor.MoveNext()) { yield return(null); } }