diff --git a/src/OpenIddict.Client.WebIntegration/OpenIddictClientWebIntegrationHandlers.Exchange.cs b/src/OpenIddict.Client.WebIntegration/OpenIddictClientWebIntegrationHandlers.Exchange.cs index f061a2cbf..177cb2a0b 100644 --- a/src/OpenIddict.Client.WebIntegration/OpenIddictClientWebIntegrationHandlers.Exchange.cs +++ b/src/OpenIddict.Client.WebIntegration/OpenIddictClientWebIntegrationHandlers.Exchange.cs @@ -12,6 +12,7 @@ using System.Net.Http.Json; using System.Text; using System.Text.Json; +using Microsoft.Extensions.Primitives; using OpenIddict.Extensions; using static OpenIddict.Client.SystemNetHttp.OpenIddictClientSystemNetHttpConstants; using static OpenIddict.Client.SystemNetHttp.OpenIddictClientSystemNetHttpHandlerFilters; @@ -209,9 +210,17 @@ public ValueTask HandleAsync(PrepareTokenRequestContext context) var request = context.Transaction.GetHttpRequestMessage() ?? throw new InvalidOperationException(SR.GetResourceString(SR.ID0173)); + // HeyBoxChat requires a "token" header containing the Bot token. + if (context.Registration.ProviderType is ProviderTypes.HeyBoxChat) + { + var settings = context.Registration.GetHeyBoxChatSettings(); + + request.Headers.Add("token", settings.Token); + } + // Trovo requires sending the client identifier in a non-standard "client-id" header and // the client secret in the payload (formatted using JSON instead of the standard format). - if (context.Registration.ProviderType is ProviderTypes.Trovo) + else if (context.Registration.ProviderType is ProviderTypes.Trovo) { request.Headers.Add("Client-ID", context.Request.ClientId); @@ -267,6 +276,20 @@ public ValueTask HandleAsync(PrepareTokenRequestContext context) request.RequestUri, name: "output", value: "json"); } + // For API calls made by Bots to HeyBoxChat, a series of parameters need to be added + // to the query string to indicate that the request is coming from a Bot, rather than + // from a HeyBoxChat desktop client or web carrying user authorization information. + else if (context.Registration.ProviderType is ProviderTypes.HeyBoxChat) + { + request.RequestUri = OpenIddictHelpers.AddQueryStringParameters( + uri: request.RequestUri, + parameters: new Dictionary + { + ["chat_os_type"] = "bot", + ["chat_version"] = "1.30.0" + }); + } + return default; } } diff --git a/src/OpenIddict.Client.WebIntegration/OpenIddictClientWebIntegrationHandlers.Userinfo.cs b/src/OpenIddict.Client.WebIntegration/OpenIddictClientWebIntegrationHandlers.Userinfo.cs index b83adfbc5..d2a4a74dd 100644 --- a/src/OpenIddict.Client.WebIntegration/OpenIddictClientWebIntegrationHandlers.Userinfo.cs +++ b/src/OpenIddict.Client.WebIntegration/OpenIddictClientWebIntegrationHandlers.Userinfo.cs @@ -439,6 +439,10 @@ ProviderTypes.Fitbit or ProviderTypes.Todoist or ProviderTypes.VkId or ProviderT ["accounts"] = context.Response["accounts"] }, + // HeyBoxChat returns a nested "result" object. + ProviderTypes.HeyBoxChat => new(context.Response["result"]?.GetNamedParameters() ?? + throw new InvalidOperationException(SR.FormatID0334("result"))), + // These providers return a nested "data" object. ProviderTypes.Kook or ProviderTypes.Kroger or ProviderTypes.Patreon or ProviderTypes.Pipedrive or ProviderTypes.Twitter diff --git a/src/OpenIddict.Client.WebIntegration/OpenIddictClientWebIntegrationProviders.xml b/src/OpenIddict.Client.WebIntegration/OpenIddictClientWebIntegrationProviders.xml index 6a7b85b6f..8b1333d6a 100644 --- a/src/OpenIddict.Client.WebIntegration/OpenIddictClientWebIntegrationProviders.xml +++ b/src/OpenIddict.Client.WebIntegration/OpenIddictClientWebIntegrationProviders.xml @@ -1121,6 +1121,27 @@ + ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ + ██ ██ █ ▄▄▄█ ███ █ ▄▄▀█ ▄▄▄ █▄▀█▀▄█ ▄▄▀█ ██ █ ▄▄▀█▄▄ ▄▄██ + ██ ▄▄ █ ▄▄▄█▄▀▀▀▄█ ▄▄▀█ ███ ███ ███ ████ ▄▄ █ ▀▀ ███ ████ + ██ ██ █ ▀▀▀███ ███ ▀▀ █ ▀▀▀ █▀▄█▄▀█ ▀▀▄█ ██ █ ██ ███ ████ + ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ + + + + + + + + + + + +