Last active
December 21, 2015 02:19
-
-
Save vmrocha/6234364 to your computer and use it in GitHub Desktop.
Flickr authentication for Windows Store applications.
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
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