2using System.Collections.Generic;
4using System.Net.Http.Headers;
7using System.Threading.Tasks;
9using Microsoft.Extensions.Logging;
11using Newtonsoft.Json.Linq;
12using Newtonsoft.Json.Serialization;
35 protected ILogger<GenericOAuthValidator>
Logger {
get; }
63 ContractResolver =
new DefaultContractResolver
65 NamingStrategy =
new SnakeCaseNamingStrategy(),
77 ILogger<GenericOAuthValidator> logger,
81 Logger = logger ??
throw new ArgumentNullException(nameof(logger));
82 OAuthConfiguration = oAuthConfiguration ??
throw new ArgumentNullException(nameof(oAuthConfiguration));
86 public async ValueTask<(
string? UserID,
string AccessCode)?>
ValidateResponseCode(
string code,
bool requireUserID, CancellationToken cancellationToken)
89 string? tokenResponsePayload =
null;
90 string? userInformationPayload =
null;
93 Logger.LogTrace(
"Validating response code...");
94 using var tokenRequest =
new HttpRequestMessage(HttpMethod.Post,
TokenUrl);
99 var tokenRequestJson = JsonConvert.SerializeObject(
103 var tokenRequestDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(tokenRequestJson)!;
104 tokenRequest.Content =
new FormUrlEncodedContent(tokenRequestDictionary);
106 using var tokenResponse = await httpClient.SendAsync(tokenRequest, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
107 tokenResponse.EnsureSuccessStatusCode();
108 tokenResponsePayload = await tokenResponse.Content.ReadAsStringAsync(cancellationToken);
109 var tokenResponseJson = JObject.Parse(tokenResponsePayload);
112 if (accessToken ==
null)
114 Logger.LogTrace(
"No token from DecodeTokenPayload!");
119 return (
null, AccessCode: accessToken);
121 Logger.LogTrace(
"Getting user details...");
124 using var userInformationRequest =
new HttpRequestMessage(HttpMethod.Get, userInfoUrl);
125 userInformationRequest.Headers.Authorization =
new AuthenticationHeaderValue(
129 using var userInformationResponse = await httpClient.SendAsync(userInformationRequest, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
130 userInformationResponse.EnsureSuccessStatusCode();
131 userInformationPayload = await userInformationResponse.Content.ReadAsStringAsync(cancellationToken);
133 var userInformationJson = JObject.Parse(userInformationPayload);
141 "Error while completing OAuth handshake! Payload:{newLine}{responsePayload}",
143 userInformationPayload ?? tokenResponsePayload);
188 httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(MediaTypeNames.Application.Json));
193 httpClient.Dispose();
Public information about a given OAuthProvider.
string? ClientId
The client ID.
OAuth configuration options.
Uri? UserInformationUrlOverride
User information URL override. Not supported by the Api.Models.OAuthProvider.GitHub provider.
Uri? RedirectUrl
The authentication server URL. Not used by all providers.
Uri? ServerUrl
The client redirect URL. Not used by all providers.
IOAuthValidator for generic OAuth2 endpoints.
OAuthProviderInfo GetProviderInfo()
Gets the OAuthProvider of validator.The client ID of the validator on success, null on failure.
string DecodeUserInformationPayload(dynamic responseJson)
Decode the user information payload responseJson .
GenericOAuthValidator(IHttpClientFactory httpClientFactory, ILogger< GenericOAuthValidator > logger, OAuthConfiguration oAuthConfiguration)
Initializes a new instance of the GenericOAuthValidator class.
readonly IHttpClientFactory httpClientFactory
The IHttpClientFactory for the GenericOAuthValidator.
HttpClient CreateHttpClient()
Create a new configured HttpClient.
ILogger< GenericOAuthValidator > Logger
The ILogger for the GenericOAuthValidator.
async ValueTask<(string? UserID, string AccessCode)?> ValidateResponseCode(string code, bool requireUserID, CancellationToken cancellationToken)
Validate a given OAuth response code .A ValueTask<TResult> resulting in null if authentication failed...
Uri UserInformationUrl
Uri to HttpMethod.Get the user information payload from.
string DecodeTokenPayload(dynamic responseJson)
Decode the token payload responseJson .
OAuthProvider Provider
The OAuthProvider this validator is for.
Uri TokenUrl
Uri to HttpMethod.Post to to get the access token.
static JsonSerializerSettings SerializerSettings()
Gets JsonSerializerSettings that should be used.
OAuthTokenRequest CreateTokenRequest(string code)
Create the OAuthTokenRequest for a given code .
OAuthGatewayStatus GatewayStatus
The OAuthGatewayStatus for the IOAuthValidator.
Generic OAuth token request.
Validates OAuth responses for a given Provider.
OAuthProvider
List of OAuth2.0 providers supported by TGS that do not support OIDC.
OAuthGatewayStatus
Status of the OAuth gateway for a provider.