Skip to content

Instantly share code, notes, and snippets.

@vmrocha
Last active December 21, 2015 02:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vmrocha/6234364 to your computer and use it in GitHub Desktop.
Save vmrocha/6234364 to your computer and use it in GitHub Desktop.
Flickr authentication for Windows Store applications.
private const string ConsumerKey = "";
private const string ConsumerSecret = "";
private const string Callback = "";
private const string RequestTokenUrl = "https://secure.flickr.com/services/oauth/request_token";
private const string AuthorizeUrl = "https://secure.flickr.com/services/oauth/authorize";
private const string AccessTokenUrl = "http://www.flickr.com/services/oauth/access_token";
private async void ButtonConnectOnClick(object sender, RoutedEventArgs e)
{
string requestTokenParameters = "oauth_callback=" + Uri.EscapeDataString(Callback);
requestTokenParameters += "&" + "oauth_consumer_key=" + ConsumerKey;
requestTokenParameters += "&" + "oauth_nonce=" + new Random().Next(1000000000);
requestTokenParameters += "&" + "oauth_signature_method=HMAC-SHA1";
requestTokenParameters += "&" + "oauth_timestamp=" + GetTimeStamp();
requestTokenParameters += "&" + "oauth_version=1.0";
var signature = CreateSignature("GET&" + Uri.EscapeDataString(RequestTokenUrl) + "&" + Uri.EscapeDataString(requestTokenParameters), ConsumerSecret);
string requestTokenUrl = RequestTokenUrl + "?" + requestTokenParameters + "&oauth_signature=" + Uri.EscapeDataString(signature);
string getResponse = await new HttpClient().GetStringAsync(requestTokenUrl);
if (getResponse != null)
{
foreach (string value in getResponse.Split('&'))
{
String[] splits = value.Split('=');
switch (splits[0])
{
case "oauth_token":
_oauthToken = splits[1];
break;
case "oauth_token_secret":
_oauthTokenSecret = splits[1];
break;
}
}
if (_oauthToken != null)
{
string autorizeUrl = AuthorizeUrl + "?oauth_token=" + _oauthToken + "&perms=write";
var requestUri = new Uri(autorizeUrl);
var callbackUri = new Uri(Callback);
WebAuthenticationResult webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(
WebAuthenticationOptions.None,
requestUri,
callbackUri);
if (webAuthenticationResult.ResponseStatus == WebAuthenticationStatus.Success)
{
int index = webAuthenticationResult.ResponseData.IndexOf("verifier=", StringComparison.Ordinal) + 9;
string verifier = webAuthenticationResult.ResponseData.Substring(index);
string accessTokenParameters =
"oauth_consumer_key=" + ConsumerKey +
"&oauth_nonce=" + new Random().Next(1000000000) +
"&oauth_signature_method=HMAC-SHA1" +
"&oauth_timestamp=" + GetTimeStamp() +
"&oauth_token=" + _oauthToken +
"&oauth_verifier=" + verifier +
"&oauth_version=1.0";
string accessTokenSignature = CreateSignature(
"GET&" + Uri.EscapeDataString(AccessTokenUrl) + "&" + Uri.EscapeDataString(accessTokenParameters),
ConsumerSecret, _oauthTokenSecret);
string accessTokenUrl = AccessTokenUrl + "?" + accessTokenParameters + "&oauth_signature=" + Uri.EscapeDataString(accessTokenSignature);
var response = await new HttpClient().GetStringAsync(accessTokenUrl);
foreach (string value in response.Split('&'))
{
String[] splits = value.Split('=');
switch (splits[0])
{
case "oauth_token":
_oauthToken = splits[1];
break;
case "oauth_token_secret":
_oauthTokenSecret = splits[1];
break;
}
}
}
else
{
Debug.WriteLine(webAuthenticationResult.ResponseStatus);
Debug.WriteLine(webAuthenticationResult.ResponseErrorDetail);
}
}
}
}
private static string CreateSignature(string baseString, string consumerSecret, string oauthTokenSecret = "")
{
IBuffer keyMaterial = CryptographicBuffer.ConvertStringToBinary(consumerSecret + "&" + oauthTokenSecret, BinaryStringEncoding.Utf8);
MacAlgorithmProvider hmacSha1Provider = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1");
CryptographicKey macKey = hmacSha1Provider.CreateKey(keyMaterial);
IBuffer dataToBeSigned = CryptographicBuffer.ConvertStringToBinary(baseString, BinaryStringEncoding.Utf8);
IBuffer signatureBuffer = CryptographicEngine.Sign(macKey, dataToBeSigned);
String signature = CryptographicBuffer.EncodeToBase64String(signatureBuffer);
return signature;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment