public App() { StringResources.Culture = DependencyService.Get <ILocale>().GetLanguage(); AuthState = new AuthState(); AuthState.UpdateHooks += SaveAuthState; var browser = DependencyService.Get <IBrowserEx>(DependencyFetchTarget.NewInstance); browser.CustomUrlScheme = CUSTOM_URL_SCHEME; browser.RedirectUri = REDIRECT_URI; // Setup for demonstration. (next 2 lines) browser.BeforeAuthzRequestHooks += LogPage.AuthzRequestLogger; browser.AfterAuthzResponseHooks += LogPage.AuthzResponseLogger; var options = new OidcClientOptions { Authority = ISSUER_URI, #if __ANDROID__ ClientId = CLIENT_ID_ANDROID, #elif __IOS__ ClientId = CLIENT_ID_IOS, #endif Scope = SCOPE, RedirectUri = REDIRECT_URI, ResponseMode = OidcClientOptions.AuthorizeResponseMode.Redirect, RefreshDiscoveryDocumentForLogin = false, Browser = browser }; // Google Accounts has endpoints provided from www.googleapis.com in addition to accounts.google.com. options.Policy.Discovery.AdditionalEndpointBaseAddresses = new[] { "https://www.googleapis.com" }; // Setup for demonstration. (next 4 lines) var handler = new HttpClientHandlerEx(); handler.BeforeRequestAsyncHooks += LogPage.HttpRequestLoggerAsync; handler.AfterResponseAsyncHooks += LogPage.HttpResponseLoggerAsync; options.BackchannelHandler = handler; // Setup for debugging. (next 5 lines) var serilog = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.Debug() .CreateLogger(); options.LoggerFactory.AddSerilog(serilog); var client = new OidcClient(options); AuthState.Update(client); var file = IsolatedStorageFile.GetUserStoreForApplication(); try { using (var stream = file.OpenFile(PREFERENCE_FILE_NAME, FileMode.Open)) { using (var reader = new StreamReader(stream)) { var crypto = DependencyService.Get <ICrypto>(); AuthState.LoadFromJson(crypto.DecryptString(reader.ReadToEnd())); } } } catch (FileNotFoundException) { } InitializeComponent(); MainPage = new MasterDetail(); }