public async Task<IAuthenticatedCrest> Authenticate(string clientId, string clientSecret, Uri listenUri, AuthenticatedCrestScope scope) { var result = new AuthenticatedCrest { ClientId = clientId, ClientSecret = clientSecret }; var state = Guid.NewGuid(); try { return await Task.Factory.StartNew( () => { _authenticatedCrests[state] = result; WEBSERVER.ListenFor(listenUri); var scopeString = GetScopeString(scope); Process.Start( $"{Settings.SsoUrl}oauth/authorize?response_type=code&redirect_uri={HttpUtility.UrlEncode(listenUri.ToString())}&client_id={clientId}&state={state}&scope={scopeString}"); var start = DateTime.UtcNow; while (result.State == AuthenticatedCrestState.WaitingForAuthentication && (DateTime.UtcNow - start) < Settings.AuthenticationTimeout) { lock (_monitor) { Monitor.Wait(_monitor, Settings.AuthenticationTimeout); } } //check for timeout if (result.State == AuthenticatedCrestState.WaitingForAuthentication) { result.State = AuthenticatedCrestState.AuthenticationFailed; } return result; }, TaskCreationOptions.LongRunning) .ConfigureAwait(false); } catch (Exception e) { Log.Logger.Error(e, $"Could not authenticate/authorize {clientId}"); result.State = AuthenticatedCrestState.AuthenticationFailed; } finally { _authenticatedCrests.Remove(state); } return result; }
private static string GetScopeString(AuthenticatedCrestScope scope) { var strings = new List<string>(); if (scope.HasFlag(AuthenticatedCrestScope.CharacterFittingsRead)) { strings.Add("characterFittingsRead"); } if (scope.HasFlag(AuthenticatedCrestScope.CharacterFittingsWrite)) { strings.Add("characterFittingsWrite"); } if (scope.HasFlag(AuthenticatedCrestScope.CharacterContactsRead)) { strings.Add("characterContactsRead"); } if (scope.HasFlag(AuthenticatedCrestScope.CharacterContactsWrite)) { strings.Add("characterContactsWrite"); } if (scope.HasFlag(AuthenticatedCrestScope.CharacterLocationRead)) { strings.Add("characterLocationRead"); } if (scope.HasFlag(AuthenticatedCrestScope.CharacterNavigationWrite)) { strings.Add("characterNavigationWrite"); } return string.Join("%20", strings); }