Last active
December 16, 2016 18:14
-
-
Save JerryNixon/7a4a06e380475f892df1bf96fd0b5c48 to your computer and use it in GitHub Desktop.
Authenticate to Wunderlist
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 class WunderlistHelper | |
{ | |
private static Template10.Services.NetworkAvailableService.NetworkAvailableService _NetworkService = new NetworkAvailableService(); | |
private static Template10.Services.SecretService.SecretService _SecretService = new SecretService(); | |
private static Template10.Services.HttpService.HttpHelper _HttpHelper = new HttpHelper(); | |
private WunderlistSettings _settings; | |
public WunderlistHelper(WunderlistSettings settings) | |
{ | |
_settings = settings; | |
} | |
string Token | |
{ | |
get { return _SecretService.ReadSecret(GetType().ToString(), nameof(Token)); } | |
set { _SecretService.WriteSecret(GetType().ToString(), nameof(Token), value); } | |
} | |
bool IsConnected => _NetworkService.IsInternetAvailable().Result; | |
public async Task<bool> AuthenticateAsync() | |
{ | |
// https://developer.wunderlist.com/documentation/concepts/authorization | |
if (!IsConnected) | |
{ | |
return false; | |
} | |
var code = await GetCodeFromUserAsync(); | |
if (string.IsNullOrEmpty(code)) | |
{ | |
return false; | |
} | |
var token = Token = await GetTokenFromCodeAsync(code); | |
if (string.IsNullOrEmpty(token)) | |
{ | |
return false; | |
} | |
SetupAuthHeaders(); | |
return true; | |
} | |
private async Task<string> GetCodeFromUserAsync() | |
{ | |
var state = Uri.EscapeUriString(Guid.NewGuid().ToString()); | |
var client_id = Uri.EscapeUriString(_settings.CLIENT_ID); | |
var redirect_uri = Uri.EscapeUriString(_settings.AUTH_CALLBACK_URL); | |
var getCodeUri = new Uri($"https://www.wunderlist.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&state={state}"); | |
var callbackUri = new Uri(_settings.AUTH_CALLBACK_URL); | |
WebAuthenticationResult response = null; | |
try | |
{ | |
response = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, getCodeUri, callbackUri); | |
} | |
catch (Exception) | |
{ | |
return string.Empty; | |
} | |
switch (response.ResponseStatus) | |
{ | |
case WebAuthenticationStatus.UserCancel: | |
case WebAuthenticationStatus.ErrorHttp: | |
return string.Empty; | |
} | |
var responseData = response.ResponseData.ToString(); | |
var responseQuerystring = new Uri(responseData).QueryString(); | |
var correlationState = responseQuerystring.GetFirstValueByName("state"); | |
if (correlationState != state) | |
{ | |
return string.Empty; | |
} | |
return responseQuerystring.GetFirstValueByName("code"); | |
} | |
private async Task<string> GetTokenFromCodeAsync(string code) | |
{ | |
var requestObject = new | |
{ | |
client_id = _settings.CLIENT_ID, | |
client_secret = _settings.CLIENT_SECRET, | |
code = code, | |
}; | |
var requestJson = JsonConvert.SerializeObject(requestObject); | |
var requestContent = new HttpStringContent(requestJson, | |
Windows.Storage.Streams.UnicodeEncoding.Utf8, "application/json"); | |
var requestUri = new Uri($"https://www.wunderlist.com/oauth/access_token"); | |
var response = await _HttpHelper.Client.PostAsync(requestUri, requestContent); | |
if (!response.IsSuccessStatusCode) | |
{ | |
return string.Empty; // <-- always a 422 | |
} | |
var responseJson = await response.Content.ReadAsStringAsync(); | |
dynamic responseModel = JsonConvert.DeserializeObject(responseJson); | |
return responseModel.access_token; | |
} | |
private void SetupAuthHeaders() | |
{ | |
var httpClientHeaders = _HttpHelper.Client.DefaultRequestHeaders; | |
var clientKey = "X-Client-ID"; | |
if (httpClientHeaders.ContainsKey(clientKey)) httpClientHeaders[clientKey] = _settings.CLIENT_ID; | |
else httpClientHeaders.Add(clientKey, _settings.CLIENT_ID); | |
var tokenKey = "X-Access-Token"; | |
if (httpClientHeaders.ContainsKey(tokenKey)) httpClientHeaders[tokenKey] = Token; | |
else httpClientHeaders.Add(tokenKey, Token); | |
} | |
} | |
public class WunderlistSettings | |
{ | |
// https://developer.wunderlist.com/apps | |
public string CLIENT_ID { get; set; } | |
public string CLIENT_SECRET { get; set; } | |
public string APP_URL { get; set; } | |
public string AUTH_CALLBACK_URL { get; set; } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment