Skip to content

Instantly share code, notes, and snippets.

@JerryNixon
Last active December 16, 2016 18:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JerryNixon/7a4a06e380475f892df1bf96fd0b5c48 to your computer and use it in GitHub Desktop.
Save JerryNixon/7a4a06e380475f892df1bf96fd0b5c48 to your computer and use it in GitHub Desktop.
Authenticate to Wunderlist
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