diff --git a/Wasari.App.Abstractions/AuthenticationOptions.cs b/Wasari.App.Abstractions/AuthenticationOptions.cs index 32b027c..a9dab3c 100644 --- a/Wasari.App.Abstractions/AuthenticationOptions.cs +++ b/Wasari.App.Abstractions/AuthenticationOptions.cs @@ -7,4 +7,8 @@ public class AuthenticationOptions public string? Password { get; set; } public bool HasCredentials => !string.IsNullOrWhiteSpace(Username) && !string.IsNullOrWhiteSpace(Password); + + public string AnonymousBasicAuthHeader { get; set; } = "Y3Jfd2ViOg=="; + + public string AuthenticatedBasicAuthHeader { get; set; } = "b2VkYXJteHN0bGgxanZhd2ltbnE6OWxFaHZIWkpEMzJqdVY1ZFc5Vk9TNTdkb3BkSnBnbzE="; } \ No newline at end of file diff --git a/Wasari.Crunchyroll/AppExtensions.cs b/Wasari.Crunchyroll/AppExtensions.cs index d654942..321ba37 100644 --- a/Wasari.Crunchyroll/AppExtensions.cs +++ b/Wasari.Crunchyroll/AppExtensions.cs @@ -26,8 +26,6 @@ public static void AddCrunchyrollServices(this IServiceCollection serviceCollect serviceCollection.AddHttpClient(c => { c.BaseAddress = crunchyBaseAddres; - c.DefaultRequestHeaders.Add("Authorization", - "Basic a3ZvcGlzdXZ6Yy0teG96Y21kMXk6R21JSTExenVPVnRnTjdlSWZrSlpibzVuLTRHTlZ0cU8="); }); serviceCollection.AddHttpClient(c => c.BaseAddress = crunchyBaseAddres) .AddPolicyHandler(GetRetryPolicy()) diff --git a/Wasari.Crunchyroll/CrunchyrollAuthenticationHandler.cs b/Wasari.Crunchyroll/CrunchyrollAuthenticationHandler.cs index 55f8f08..8a92f1f 100644 --- a/Wasari.Crunchyroll/CrunchyrollAuthenticationHandler.cs +++ b/Wasari.Crunchyroll/CrunchyrollAuthenticationHandler.cs @@ -33,28 +33,28 @@ public CrunchyrollAuthenticationHandler(IOptions CreateAccessToken() + private async Task CreateAccessToken(string username = null, string password = null) { - using var formUrlEncodedContent = new FormUrlEncodedContent(new[] { new KeyValuePair("grant_type", "client_id") }); - using var authResponse = await AuthHttpClient.PostAsync("auth/v1/token", formUrlEncodedContent); - authResponse.EnsureSuccessStatusCode(); - - await using var responseStream = await authResponse.Content.ReadAsStreamAsync(); - var jsonDocument = await JsonDocument.ParseAsync(responseStream); - return jsonDocument.RootElement.GetProperty("access_token").GetString(); - } - - private async Task CreateAccessToken(string username, string password) - { - using var formUrlEncodedContent = new FormUrlEncodedContent(new[] + var keys = new List>() + { + new("grant_type", "password") + }; + + if(!string.IsNullOrEmpty(username)) keys.Add(new KeyValuePair(nameof(username), username)); + if (!string.IsNullOrEmpty(password)) { - new KeyValuePair("grant_type", "password"), - new KeyValuePair("username", username), - new KeyValuePair("password", password), - new KeyValuePair("scope", "offline_access") - }); + keys.Add(new KeyValuePair(nameof(password), password)); + keys.Add(new KeyValuePair("scope", "offline_access")); + } + + using var formUrlEncodedContent = new FormUrlEncodedContent(keys); + using var httpMessage = new HttpRequestMessage(); + httpMessage.Method = HttpMethod.Post; + httpMessage.Content = formUrlEncodedContent; + httpMessage.RequestUri = new Uri("auth/v1/token", UriKind.Relative); + httpMessage.Headers.Authorization = new AuthenticationHeaderValue("Basic", string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password) ? AuthenticationOptions.Value.AnonymousBasicAuthHeader : AuthenticationOptions.Value.AuthenticatedBasicAuthHeader); - using var authResponse = await AuthHttpClient.PostAsync("auth/v1/token", formUrlEncodedContent); + using var authResponse = await AuthHttpClient.SendAsync(httpMessage); authResponse.EnsureSuccessStatusCode(); await using var responseStream = await authResponse.Content.ReadAsStreamAsync();