public static async Task<string> StartUserAuthentication(this IUserSession session)
{
if (string.IsNullOrWhiteSpace(session.clientID))
throw new ArgumentException("ClientID must be specified", session.clientID);
if (string.IsNullOrWhiteSpace(session.clientSecret))
throw new ArgumentException("ClientSecret must be specified", session.clientSecret);
if (session.PlatformAdaptor == null)
throw new ArgumentException("Need a Platform Adaptor");
var sinceEpoch = session.GenerateTimestamp();
var nonce = session.GenerateNoonce();
var sigBaseStringParams =
string.Format(
"oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method=HMAC-SHA1&oauth_timestamp={2}&oauth_version=1.0",
session.clientID,
nonce,
sinceEpoch);
var sigBaseString = string.Format("POST&{0}&{1}", TwitterApi.RequestTokenUrl().UrlEncode(), sigBaseStringParams.UrlEncode());
var signature = session.GenerateSignature(session.clientSecret, sigBaseString, null);
var dataToPost = string.Format(
"OAuth realm=\"\", oauth_nonce=\"{0}\", oauth_timestamp=\"{1}\", oauth_consumer_key=\"{2}\", oauth_signature_method=\"HMAC-SHA1\", oauth_version=\"1.0\", oauth_signature=\"{3}\"",
nonce,
sinceEpoch,
session.clientID,
signature.UrlEncode());
var response = await PostData(TwitterApi.RequestTokenUrl(), dataToPost);
if (string.IsNullOrWhiteSpace(response))
return null;
var oAuthToken = "";
foreach (var splits in response.Split('&').Select(t => t.Split('=')))
{
switch (splits[0])
{
case "oauth_token": //these tokens are request tokens, first step before getting access tokens
oAuthToken = splits[1];
break;
case "oauth_token_secret": // not used
// var oAuthTokenSecret = splits[1];
break;
case "oauth_callback_confirmed":
break;
}
}
if (!string.IsNullOrWhiteSpace(oAuthToken))
session.PlatformAdaptor.DisplayAuthInBrowser(TwitterApi.AuthenticateUrl()+ oAuthToken);
return oAuthToken;
}