Skip to content

Instantly share code, notes, and snippets.

@mabster
Created April 10, 2012 08:10
Show Gist options
  • Save mabster/2349261 to your computer and use it in GitHub Desktop.
Save mabster/2349261 to your computer and use it in GitHub Desktop.
TwitterAuthenticator.AuthenticateUser backport attempt
public static async Task<WebAuthenticationResult> AuthenticateUser(string twitterClientID, string twitterCallbackUrl
{
if (string.IsNullOrWhiteSpace(twitterClientID))
throw new ArgumentException("TwitterClientID must be specified", twitterClientID);
if (string.IsNullOrWhiteSpace(twitterCallbackUrl))
throw new ArgumentException("TwitterCallbackUrl must be specified", twitterCallbackUrl);
if (string.IsNullOrWhiteSpace(twitterClientSecret))
throw new ArgumentException("TwitterClientSecret must be specified", twitterClientSecret);
var sinceEpoch = (DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime());
var rand = new Random();
var twitterUrl = "https://api.twitter.com/oauth/request_token";
var nonce = rand.Next(1000000000);
var sigBaseStringParams = "oauth_callback=" + Uri.EscapeUriString(twitterCallbackUrl)
+ "&" + "oauth_consumer_key=" + twitterClientID
+ "&" + "oauth_nonce=" + nonce.ToString()
+ "&" + "oauth_signature_method=HMAC-SHA1"
+ "&" + "oauth_timestamp=" + Math.Round(sinceEpoch.TotalSeconds)
+ "&" + "oauth_version=1.0";
var sigBaseString = "POST&" + Uri.EscapeUriString(twitterUrl) + "&" + Uri.EscapeUriString(sigBaseStringParams);
var enc = new System.Text.UTF8Encoding();
var keyMaterial = enc.GetBytes(twitterClientSecret + "&"); // CryptographicBuffer.ConvertStringToBinary(twitterClientSecret + "&", BinaryStringEncoding.Utf8);
var hmacSha1Provider = System.Security.Cryptography.HMACSHA1.Create(); // var hmacSha1Provider = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1");
hmacSha1Provider.Key = keyMaterial; // var macKey = hmacSha1Provider.CreateKey(keyMaterial);
var dataToBeSigned = enc.GetBytes(sigBaseString); // CryptographicBuffer.ConvertStringToBinary(sigBaseString, BinaryStringEncoding.Utf8);
var signatureBuffer = CryptographicEngine.Sign(macKey, dataToBeSigned);
var signature = Convert.ToBase64String(signatureBuffer); // CryptographicBuffer.EncodeToBase64String(signatureBuffer);
var dataToPost = "OAuth oauth_callback=\"" + Uri.EscapeUriString(twitterCallbackUrl)
+ "\", oauth_consumer_key=\"" + twitterClientID
+ "\", oauth_nonce=\"" + nonce.ToString()
+ "\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"" + Math.Round(sinceEpoch.TotalSeconds)
+ "\", oauth_version=\"1.0\", oauth_signature=\"" + Uri.EscapeUriString(signature) + "\"";
var response = await PostData(twitterUrl, dataToPost);
if (string.IsNullOrWhiteSpace(response))
{
return null;
}
String oauth_token = null;
String oauth_token_secret = null;
var keyValPairs = response.Split('&');
for (int i = 0; i < keyValPairs.Length; i++)
{
var splits = keyValPairs[i].Split('=');
switch (splits[0])
{
case "oauth_token":
oauth_token = splits[1];
break;
case "oauth_token_secret":
oauth_token_secret = splits[1];
break;
}
}
if (string.IsNullOrWhiteSpace(oauth_token))
return null;
twitterUrl = "https://api.twitter.com/oauth/authorize?oauth_token=" + oauth_token;
var startUri = new Uri(twitterUrl);
var endUri = new Uri(twitterCallbackUrl);
return await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, startUri, endUri);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment