using Microsoft.AspNetCore.Components.Authorization; using System.Web; using Microsoft.Extensions.Configuration; namespace Neighbourhood.omg.lol; public partial class LoginWebViewPage : ContentPage { private AuthenticationStateProvider AuthStateProvider { get; set; } private NavigatorService NavigatorService { get; set; } private IConfiguration Configuration { get; set; } private RestService api { get; set; } private string? client_id; private string? client_secret; private string? redirect_uri; public LoginWebViewPage(AuthenticationStateProvider authStateProvider, NavigatorService navigatorService, IConfiguration configuration, RestService restService) { this.AuthStateProvider = authStateProvider; this.NavigatorService = navigatorService; this.Configuration = configuration; this.api = restService; InitializeComponent(); client_id = configuration.GetValue("client_id"); client_secret = configuration.GetValue("client_secret"); redirect_uri = configuration.GetValue("redirect_uri"); // make sure they're all not null first. if ( client_id != null && client_secret != null && redirect_uri != null) { //this.loginwebview.UserAgent = new System.Net.Http.Headers.ProductInfoHeaderValue(App.Name, App.Version).ToString(); this.loginwebview.Source = $"https://home.omg.lol/oauth/authorize?client_id={client_id}&scope=everything&redirect_uri={redirect_uri}&response_type=code"; } } public async void loginwebview_Navigating(object sender, WebNavigatingEventArgs e) { if ( client_id != null && client_secret != null && redirect_uri != null && e.Url.StartsWith(redirect_uri)) { Uri uri = new Uri(e.Url); var query = HttpUtility.ParseQueryString(uri.Query); string? code = query.Get("code"); if (!string.IsNullOrEmpty(code)) { string? token = await api.OAuth(code, client_id, client_secret, redirect_uri); if (!string.IsNullOrEmpty(token)) { await ((CustomAuthenticationStateProvider)this.AuthStateProvider).Login(token); NavigatorService.NavigationManager.NavigateTo(NavigatorService.NavigationManager.Uri, forceLoad: true); await Shell.Current.GoToAsync(".."); } } } } }