From 3b4bd2d703adbd4fc97a9b17476b4a497b05002a Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 7 Dec 2020 12:34:09 -0500 Subject: [PATCH] Adds URL setting to OAuthConfiguration --- README.md | 7 +++- .../Configuration/OAuthConfiguration.cs | 32 ++-------------- .../Configuration/OAuthConfigurationBase.cs | 37 +++++++++++++++++++ .../Security/OAuth/DiscordTokenRequest.cs | 4 +- .../Security/OAuth/OAuthTokenRequest.cs | 4 +- .../Security/OAuth/TGForumsOAuthValidator.cs | 2 +- 6 files changed, 52 insertions(+), 34 deletions(-) create mode 100644 src/Tgstation.Server.Host/Configuration/OAuthConfigurationBase.cs diff --git a/README.md b/README.md index 922fbab65d..c2cb3d211d 100644 --- a/README.md +++ b/README.md @@ -133,11 +133,16 @@ Create an `appsettings.Production.json` file next to `appsettings.json`. This wi - `Security:OAuth`: Sets the OAuth client ID and secret for a given ``. The currently supported providers are `GitHub`, `Discord`, and `TGForums`. Setting these fields to `null` disables logins with the provider, but does not stop users from associating their accounts using the API. Sample Entry: ```json "GitHubOAuth":{ - "ClientId": "... (Note for `TGForums`, this is the redirect_uri used)", + "Url": "...", (Used with certain providers) + "ClientId": "...", "ClientSecret": "..." } ``` +The following providers use the `Url` setting: + +- `TGForums`: Used as the OAuth redirect url. + ### Database Configuration If using a MariaDB/MySQL server, our client library [recommends you set 'utf8mb4' as your default charset](https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql#1-recommended-server-charset) disregard at your own risk. diff --git a/src/Tgstation.Server.Host/Configuration/OAuthConfiguration.cs b/src/Tgstation.Server.Host/Configuration/OAuthConfiguration.cs index b0dc12fc21..5d865c76ed 100644 --- a/src/Tgstation.Server.Host/Configuration/OAuthConfiguration.cs +++ b/src/Tgstation.Server.Host/Configuration/OAuthConfiguration.cs @@ -1,37 +1,13 @@ -using System; - namespace Tgstation.Server.Host.Configuration { /// - /// OAuth options. + /// OAuth configuration options. /// - class OAuthConfiguration + sealed class OAuthConfiguration : OAuthConfigurationBase { /// - /// The client ID. + /// The redirect or server URL. Not used by all providers. /// - public string ClientId { get; set; } - - /// - /// The client secret. - /// - public string ClientSecret { get; set; } - - /// - /// Initializes a new instance of the . - /// - public OAuthConfiguration() { } - - /// - /// Initializes a new instance of the . - /// - /// The to copy settings from. - public OAuthConfiguration(OAuthConfiguration oAuthConfiguration) - { - if (oAuthConfiguration == null) - throw new ArgumentNullException(nameof(oAuthConfiguration)); - ClientId = oAuthConfiguration.ClientId; - ClientSecret = oAuthConfiguration.ClientSecret; - } + public string Url { get; set; } } } diff --git a/src/Tgstation.Server.Host/Configuration/OAuthConfigurationBase.cs b/src/Tgstation.Server.Host/Configuration/OAuthConfigurationBase.cs new file mode 100644 index 0000000000..6fb4fda5fb --- /dev/null +++ b/src/Tgstation.Server.Host/Configuration/OAuthConfigurationBase.cs @@ -0,0 +1,37 @@ +using System; + +namespace Tgstation.Server.Host.Configuration +{ + /// + /// Base OAuth options. + /// + abstract class OAuthConfigurationBase + { + /// + /// The client ID. + /// + public string ClientId { get; set; } + + /// + /// The client secret. + /// + public string ClientSecret { get; set; } + + /// + /// Initializes a new instance of the . + /// + public OAuthConfigurationBase() { } + + /// + /// Initializes a new instance of the . + /// + /// The to copy settings from. + public OAuthConfigurationBase(OAuthConfigurationBase oAuthConfiguration) + { + if (oAuthConfiguration == null) + throw new ArgumentNullException(nameof(oAuthConfiguration)); + ClientId = oAuthConfiguration.ClientId; + ClientSecret = oAuthConfiguration.ClientSecret; + } + } +} diff --git a/src/Tgstation.Server.Host/Security/OAuth/DiscordTokenRequest.cs b/src/Tgstation.Server.Host/Security/OAuth/DiscordTokenRequest.cs index fdd6dcc393..a3ee43c704 100644 --- a/src/Tgstation.Server.Host/Security/OAuth/DiscordTokenRequest.cs +++ b/src/Tgstation.Server.Host/Security/OAuth/DiscordTokenRequest.cs @@ -21,9 +21,9 @@ namespace Tgstation.Server.Host.Security.OAuth /// /// Initializes a new instance of the . /// - /// The for the . + /// The for the . /// The OAuth code for the . - public DiscordTokenRequest(OAuthConfiguration oAuthConfiguration, string code) + public DiscordTokenRequest(OAuthConfigurationBase oAuthConfiguration, string code) : base(oAuthConfiguration, code) { GrantType = "authorization_code"; diff --git a/src/Tgstation.Server.Host/Security/OAuth/OAuthTokenRequest.cs b/src/Tgstation.Server.Host/Security/OAuth/OAuthTokenRequest.cs index 7f03023625..1db7a8f692 100644 --- a/src/Tgstation.Server.Host/Security/OAuth/OAuthTokenRequest.cs +++ b/src/Tgstation.Server.Host/Security/OAuth/OAuthTokenRequest.cs @@ -6,7 +6,7 @@ namespace Tgstation.Server.Host.Security.OAuth /// /// Generic OAuth token request. /// - class OAuthTokenRequest : OAuthConfiguration + class OAuthTokenRequest : OAuthConfigurationBase { /// /// The OAuth code. @@ -18,7 +18,7 @@ namespace Tgstation.Server.Host.Security.OAuth /// /// The to build from. /// The OAuth code received from the browser. - public OAuthTokenRequest(OAuthConfiguration oAuthConfiguration, string code) + public OAuthTokenRequest(OAuthConfigurationBase oAuthConfiguration, string code) : base(oAuthConfiguration) { Code = code ?? throw new ArgumentNullException(nameof(code)); diff --git a/src/Tgstation.Server.Host/Security/OAuth/TGForumsOAuthValidator.cs b/src/Tgstation.Server.Host/Security/OAuth/TGForumsOAuthValidator.cs index afdd635974..775551af97 100644 --- a/src/Tgstation.Server.Host/Security/OAuth/TGForumsOAuthValidator.cs +++ b/src/Tgstation.Server.Host/Security/OAuth/TGForumsOAuthValidator.cs @@ -65,7 +65,7 @@ namespace Tgstation.Server.Host.Security.OAuth { UriBuilder builder = new UriBuilder("https://tgstation13.org/phpBB/oauth_create_session.php") { - Query = $"site_private_token={HttpUtility.UrlEncode(Convert.ToBase64String(Encoding.UTF8.GetBytes(OAuthConfiguration.ClientSecret)))}&return_uri={HttpUtility.UrlEncode(OAuthConfiguration.ClientId)}" + Query = $"site_private_token={HttpUtility.UrlEncode(Convert.ToBase64String(Encoding.UTF8.GetBytes(OAuthConfiguration.ClientSecret)))}&return_uri={HttpUtility.UrlEncode(OAuthConfiguration.Url)}" }; using var request = new HttpRequestMessage(HttpMethod.Get, builder.Uri);