diff --git a/frontend/src/views/settings/SettingsView.vue b/frontend/src/views/settings/SettingsView.vue index acb2402..7dfe909 100644 --- a/frontend/src/views/settings/SettingsView.vue +++ b/frontend/src/views/settings/SettingsView.vue @@ -263,7 +263,7 @@ Connect via SimpleFIN

- Visit simplefin.org/bridge to get a setup token for your bank, then paste it below. + Visit beta-bridge.simplefin.org to get a setup token for your bank, then paste it below.

($"{accessUrl}/accounts"); + var response = await GetWithAuthAsync($"{accessUrl}/accounts"); if (response == null) return new List(); @@ -60,7 +61,7 @@ public class SimpleFinSyncProvider : IAccountSyncProvider var startUnix = new DateTimeOffset(startDate).ToUnixTimeSeconds(); var endUnix = new DateTimeOffset(endDate).ToUnixTimeSeconds(); - var response = await _httpClient.GetFromJsonAsync( + var response = await GetWithAuthAsync( $"{accessUrl}/accounts?start-date={startUnix}&end-date={endUnix}"); if (response == null) @@ -90,6 +91,25 @@ public class SimpleFinSyncProvider : IAccountSyncProvider return result; } + /// + /// HttpClient does not extract Basic Auth credentials from URLs (user:pass@host). + /// This method parses the URI, builds the Authorization header, and strips credentials from the request URL. + /// + private async Task GetWithAuthAsync(string url) + { + var uri = new Uri(url); + var request = new HttpRequestMessage(HttpMethod.Get, new UriBuilder(uri) { UserName = "", Password = "" }.Uri); + if (!string.IsNullOrEmpty(uri.UserInfo)) + { + var credentials = Convert.ToBase64String(Encoding.UTF8.GetBytes(uri.UserInfo)); + request.Headers.Authorization = new AuthenticationHeaderValue("Basic", credentials); + } + + var response = await _httpClient.SendAsync(request); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadFromJsonAsync(); + } + private static string GuessAccountType(string name) { var lower = name.ToLowerInvariant();