- 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();