Created
April 10, 2012 08:10
-
-
Save mabster/2349261 to your computer and use it in GitHub Desktop.
TwitterAuthenticator.AuthenticateUser backport attempt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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