private OAuth BuildAuthenticatedResult(string fullUrl, IEnumerable<KeyValuePair<string, string>> parameters,
string method, bool multipartform = false)
{
var url = fullUrl;
var oauthToken = _credentials.Token;
var oauthConsumerKey = _credentials.ConsumerKey;
var oauthNonce = GenerateNoonce();
var oauthTimestamp = GenerateTimestamp();
//GS - When building the signature string the params
//must be in alphabetical order. I can't be bothered
//with that, get SortedDictionary to do it's thing
var sd = new SortedDictionary<string, string>
{
{"oauth_consumer_key", oauthConsumerKey},
{"oauth_nonce", oauthNonce},
{"oauth_signature_method", OAuthSignatureMethod},
{"oauth_timestamp", oauthTimestamp},
{"oauth_token", oauthToken},
{"oauth_version", OAuthVersion}
};
var querystring = "";
var baseString = method.ToUpper() + "&" + Uri.EscapeDataString(url) + "&";
if (!multipartform) // with Multi-part form, only the oauth_ headers are used to create the signature
{
if (method.Equals("GET", StringComparison.OrdinalIgnoreCase))
{
querystring = parameters.Aggregate(querystring,
(current, entry) => current + (entry.Key + "=" + entry.Value + "&"));
}
foreach (var entry in parameters)
sd.Add(entry.Key, entry.Value);
}
foreach (var entry in sd)
{
string value;
if (entry.Key == "status" || entry.Key == "text" || entry.Key == "screen_name" ||
entry.Key == "user_id" || entry.Key == "track" || entry.Key == "follow" ||
entry.Key == "locations")
{
value = Uri.EscapeDataString(entry.Value);
}
else
{
value = entry.Value;
}
baseString += Uri.EscapeDataString(entry.Key + "=" + value + "&");
}
baseString = baseString.Substring(0, baseString.Length - 3);
var signingKey = Uri.EscapeDataString(_credentials.ConsumerSecret) + "&" +
Uri.EscapeDataString(_credentials.TokenSecret);
var encoding = Encoding.UTF8;
PlatformAdaptor.AssignKey(encoding.GetBytes(signingKey));
var data = Encoding.UTF8.GetBytes(baseString);
var hash = PlatformAdaptor.ComputeHash(data);
var signatureString = Convert.ToBase64String(hash);
return new OAuth
{
Nonce = oauthNonce,
SignatureMethod = OAuthSignatureMethod,
Timestamp = oauthTimestamp,
ConsumerKey = oauthConsumerKey,
Token = oauthToken,
SignatureString = signatureString,
Version = OAuthVersion,
Header = string.Format(
"OAuth oauth_nonce=\"{0}\", oauth_signature_method=\"{1}\", oauth_timestamp=\"{2}\", oauth_consumer_key=\"{3}\", oauth_token=\"{4}\", oauth_signature=\"{5}\", oauth_version=\"{6}\"",
Uri.EscapeDataString(oauthNonce),
Uri.EscapeDataString(OAuthSignatureMethod),
Uri.EscapeDataString(oauthTimestamp),
Uri.EscapeDataString(oauthConsumerKey),
Uri.EscapeDataString(oauthToken),
Uri.EscapeDataString(signatureString),
Uri.EscapeDataString(OAuthVersion))
};
}