diff --git a/modules/openapi-generator/src/main/resources/csharp/auth/OAuthAuthenticator.mustache b/modules/openapi-generator/src/main/resources/csharp/auth/OAuthAuthenticator.mustache
index d71f262a810f..c336c8ad5ccf 100644
--- a/modules/openapi-generator/src/main/resources/csharp/auth/OAuthAuthenticator.mustache
+++ b/modules/openapi-generator/src/main/resources/csharp/auth/OAuthAuthenticator.mustache
@@ -11,8 +11,25 @@ namespace {{packageName}}.Client.Auth
///
/// An authenticator for OAuth2 authentication flows
///
- public class OAuthAuthenticator : AuthenticatorBase
+ public class OAuthAuthenticator : IAuthenticator
{
+ private TokenResponse{{nrt?}} _token;
+
+ ///
+ /// Returns the current authentication token. Can return null if there is no authentication token, or it has expired.
+ ///
+ public string{{nrt?}} Token
+ {
+ get
+ {
+ if (_token == null) return null;
+ if (_token.ExpiresIn == null) return _token.AccessToken;
+ if (_token.ExpiresAt < DateTime.Now) return null;
+
+ return _token.AccessToken;
+ }
+ }
+
readonly string _tokenUrl;
readonly string _clientId;
readonly string _clientSecret;
@@ -31,7 +48,7 @@ namespace {{packageName}}.Client.Auth
string{{nrt?}} scope,
OAuthFlow? flow,
JsonSerializerSettings serializerSettings,
- IReadableConfiguration configuration) : base("")
+ IReadableConfiguration configuration)
{
_tokenUrl = tokenUrl;
_clientId = clientId;
@@ -62,9 +79,8 @@ namespace {{packageName}}.Client.Auth
///
/// Creates an authentication parameter from an access token.
///
- /// Access token to create a parameter from.
/// An authentication parameter.
- protected override async ValueTask GetAuthenticationParameter(string accessToken)
+ protected async ValueTask GetAuthenticationParameter()
{
var token = string.IsNullOrEmpty(Token) ? await GetToken().ConfigureAwait(false) : Token;
return new HeaderParameter(KnownHeaders.Authorization, token);
@@ -76,31 +92,45 @@ namespace {{packageName}}.Client.Auth
/// An authentication token.
async Task GetToken()
{
- var client = new RestClient(_tokenUrl,
- configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
-
- var request = new RestRequest()
- .AddParameter("grant_type", _grantType)
- .AddParameter("client_id", _clientId)
- .AddParameter("client_secret", _clientSecret);
+ var client = new RestClient(_tokenUrl, configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
+ var request = new RestRequest();
+ if (!string.IsNullOrWhiteSpace(_token?.RefreshToken))
+ {
+ request.AddParameter("grant_type", "refresh_token")
+ .AddParameter("refresh_token", _token.RefreshToken);
+ }
+ else
+ {
+ request
+ .AddParameter("grant_type", _grantType)
+ .AddParameter("client_id", _clientId)
+ .AddParameter("client_secret", _clientSecret);
+ }
if (!string.IsNullOrEmpty(_scope))
{
request.AddParameter("scope", _scope);
}
-
- var response = await client.PostAsync(request).ConfigureAwait(false);
-
+ _token = await client.PostAsync(request).ConfigureAwait(false);
// RFC6749 - token_type is case insensitive.
// RFC6750 - In Authorization header Bearer should be capitalized.
// Fix the capitalization irrespective of token_type casing.
- switch (response.TokenType?.ToLower())
+ switch (_token?.TokenType?.ToLower())
{
case "bearer":
- return $"Bearer {response.AccessToken}";
+ return $"Bearer {_token.AccessToken}";
default:
- return $"{response.TokenType} {response.AccessToken}";
+ return $"{_token?.TokenType} {_token?.AccessToken}";
}
}
+
+ ///
+ /// Retrieves the authentication token (creating a new one if necessary) and adds it to the current request
+ ///
+ ///
+ ///
+ ///
+ public async ValueTask Authenticate(IRestClient client, RestRequest request)
+ => request.AddOrUpdateParameter(await GetAuthenticationParameter().ConfigureAwait(false));
}
}
diff --git a/modules/openapi-generator/src/main/resources/csharp/auth/TokenResponse.mustache b/modules/openapi-generator/src/main/resources/csharp/auth/TokenResponse.mustache
index f118b97a9dd5..7a72e04c12c2 100644
--- a/modules/openapi-generator/src/main/resources/csharp/auth/TokenResponse.mustache
+++ b/modules/openapi-generator/src/main/resources/csharp/auth/TokenResponse.mustache
@@ -1,5 +1,6 @@
{{>partial_header}}
+using System;
using Newtonsoft.Json;
namespace {{packageName}}.Client.Auth
@@ -10,5 +11,14 @@ namespace {{packageName}}.Client.Auth
public string TokenType { get; set; }
[JsonProperty("access_token")]
public string AccessToken { get; set; }
+ [JsonProperty("expires_in")]
+ public int? ExpiresIn { get; set; }
+ [JsonProperty("created")]
+ public DateTime? Created { get; set; }
+
+ [JsonProperty("refresh_token")]
+ public string{{nrt?}} RefreshToken { get; set; }
+
+ public DateTime? ExpiresAt => ExpiresIn == null ? null : Created?.AddSeconds(ExpiresIn.Value);
}
}
\ No newline at end of file
diff --git a/samples/client/petstore/csharp/restsharp/net4.7/MultipleFrameworks/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs b/samples/client/petstore/csharp/restsharp/net4.7/MultipleFrameworks/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
index 516b93d2f6aa..e731f1c71bea 100644
--- a/samples/client/petstore/csharp/restsharp/net4.7/MultipleFrameworks/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
+++ b/samples/client/petstore/csharp/restsharp/net4.7/MultipleFrameworks/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
@@ -19,8 +19,25 @@ namespace Org.OpenAPITools.Client.Auth
///
/// An authenticator for OAuth2 authentication flows
///
- public class OAuthAuthenticator : AuthenticatorBase
+ public class OAuthAuthenticator : IAuthenticator
{
+ private TokenResponse _token;
+
+ ///
+ /// Returns the current authentication token. Can return null if there is no authentication token, or it has expired.
+ ///
+ public string Token
+ {
+ get
+ {
+ if (_token == null) return null;
+ if (_token.ExpiresIn == null) return _token.AccessToken;
+ if (_token.ExpiresAt < DateTime.Now) return null;
+
+ return _token.AccessToken;
+ }
+ }
+
readonly string _tokenUrl;
readonly string _clientId;
readonly string _clientSecret;
@@ -39,7 +56,7 @@ public OAuthAuthenticator(
string scope,
OAuthFlow? flow,
JsonSerializerSettings serializerSettings,
- IReadableConfiguration configuration) : base("")
+ IReadableConfiguration configuration)
{
_tokenUrl = tokenUrl;
_clientId = clientId;
@@ -70,9 +87,8 @@ public OAuthAuthenticator(
///
/// Creates an authentication parameter from an access token.
///
- /// Access token to create a parameter from.
/// An authentication parameter.
- protected override async ValueTask GetAuthenticationParameter(string accessToken)
+ protected async ValueTask GetAuthenticationParameter()
{
var token = string.IsNullOrEmpty(Token) ? await GetToken().ConfigureAwait(false) : Token;
return new HeaderParameter(KnownHeaders.Authorization, token);
@@ -84,31 +100,45 @@ protected override async ValueTask GetAuthenticationParameter(string
/// An authentication token.
async Task GetToken()
{
- var client = new RestClient(_tokenUrl,
- configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
-
- var request = new RestRequest()
- .AddParameter("grant_type", _grantType)
- .AddParameter("client_id", _clientId)
- .AddParameter("client_secret", _clientSecret);
+ var client = new RestClient(_tokenUrl, configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
+ var request = new RestRequest();
+ if (!string.IsNullOrWhiteSpace(_token?.RefreshToken))
+ {
+ request.AddParameter("grant_type", "refresh_token")
+ .AddParameter("refresh_token", _token.RefreshToken);
+ }
+ else
+ {
+ request
+ .AddParameter("grant_type", _grantType)
+ .AddParameter("client_id", _clientId)
+ .AddParameter("client_secret", _clientSecret);
+ }
if (!string.IsNullOrEmpty(_scope))
{
request.AddParameter("scope", _scope);
}
-
- var response = await client.PostAsync(request).ConfigureAwait(false);
-
+ _token = await client.PostAsync(request).ConfigureAwait(false);
// RFC6749 - token_type is case insensitive.
// RFC6750 - In Authorization header Bearer should be capitalized.
// Fix the capitalization irrespective of token_type casing.
- switch (response.TokenType?.ToLower())
+ switch (_token?.TokenType?.ToLower())
{
case "bearer":
- return $"Bearer {response.AccessToken}";
+ return $"Bearer {_token.AccessToken}";
default:
- return $"{response.TokenType} {response.AccessToken}";
+ return $"{_token?.TokenType} {_token?.AccessToken}";
}
}
+
+ ///
+ /// Retrieves the authentication token (creating a new one if necessary) and adds it to the current request
+ ///
+ ///
+ ///
+ ///
+ public async ValueTask Authenticate(IRestClient client, RestRequest request)
+ => request.AddOrUpdateParameter(await GetAuthenticationParameter().ConfigureAwait(false));
}
}
diff --git a/samples/client/petstore/csharp/restsharp/net4.7/MultipleFrameworks/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs b/samples/client/petstore/csharp/restsharp/net4.7/MultipleFrameworks/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
index 21fd27c376fa..5ff4349979fd 100644
--- a/samples/client/petstore/csharp/restsharp/net4.7/MultipleFrameworks/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
+++ b/samples/client/petstore/csharp/restsharp/net4.7/MultipleFrameworks/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
@@ -8,6 +8,7 @@
*/
+using System;
using Newtonsoft.Json;
namespace Org.OpenAPITools.Client.Auth
@@ -18,5 +19,14 @@ class TokenResponse
public string TokenType { get; set; }
[JsonProperty("access_token")]
public string AccessToken { get; set; }
+ [JsonProperty("expires_in")]
+ public int? ExpiresIn { get; set; }
+ [JsonProperty("created")]
+ public DateTime? Created { get; set; }
+
+ [JsonProperty("refresh_token")]
+ public string RefreshToken { get; set; }
+
+ public DateTime? ExpiresAt => ExpiresIn == null ? null : Created?.AddSeconds(ExpiresIn.Value);
}
}
\ No newline at end of file
diff --git a/samples/client/petstore/csharp/restsharp/net4.7/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs b/samples/client/petstore/csharp/restsharp/net4.7/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
index d7fb1293b34b..6c6817ef501a 100644
--- a/samples/client/petstore/csharp/restsharp/net4.7/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
+++ b/samples/client/petstore/csharp/restsharp/net4.7/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
@@ -19,8 +19,25 @@ namespace Org.OpenAPITools.Client.Auth
///
/// An authenticator for OAuth2 authentication flows
///
- public class OAuthAuthenticator : AuthenticatorBase
+ public class OAuthAuthenticator : IAuthenticator
{
+ private TokenResponse _token;
+
+ ///
+ /// Returns the current authentication token. Can return null if there is no authentication token, or it has expired.
+ ///
+ public string Token
+ {
+ get
+ {
+ if (_token == null) return null;
+ if (_token.ExpiresIn == null) return _token.AccessToken;
+ if (_token.ExpiresAt < DateTime.Now) return null;
+
+ return _token.AccessToken;
+ }
+ }
+
readonly string _tokenUrl;
readonly string _clientId;
readonly string _clientSecret;
@@ -39,7 +56,7 @@ public OAuthAuthenticator(
string scope,
OAuthFlow? flow,
JsonSerializerSettings serializerSettings,
- IReadableConfiguration configuration) : base("")
+ IReadableConfiguration configuration)
{
_tokenUrl = tokenUrl;
_clientId = clientId;
@@ -70,9 +87,8 @@ public OAuthAuthenticator(
///
/// Creates an authentication parameter from an access token.
///
- /// Access token to create a parameter from.
/// An authentication parameter.
- protected override async ValueTask GetAuthenticationParameter(string accessToken)
+ protected async ValueTask GetAuthenticationParameter()
{
var token = string.IsNullOrEmpty(Token) ? await GetToken().ConfigureAwait(false) : Token;
return new HeaderParameter(KnownHeaders.Authorization, token);
@@ -84,31 +100,45 @@ protected override async ValueTask GetAuthenticationParameter(string
/// An authentication token.
async Task GetToken()
{
- var client = new RestClient(_tokenUrl,
- configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
-
- var request = new RestRequest()
- .AddParameter("grant_type", _grantType)
- .AddParameter("client_id", _clientId)
- .AddParameter("client_secret", _clientSecret);
+ var client = new RestClient(_tokenUrl, configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
+ var request = new RestRequest();
+ if (!string.IsNullOrWhiteSpace(_token?.RefreshToken))
+ {
+ request.AddParameter("grant_type", "refresh_token")
+ .AddParameter("refresh_token", _token.RefreshToken);
+ }
+ else
+ {
+ request
+ .AddParameter("grant_type", _grantType)
+ .AddParameter("client_id", _clientId)
+ .AddParameter("client_secret", _clientSecret);
+ }
if (!string.IsNullOrEmpty(_scope))
{
request.AddParameter("scope", _scope);
}
-
- var response = await client.PostAsync(request).ConfigureAwait(false);
-
+ _token = await client.PostAsync(request).ConfigureAwait(false);
// RFC6749 - token_type is case insensitive.
// RFC6750 - In Authorization header Bearer should be capitalized.
// Fix the capitalization irrespective of token_type casing.
- switch (response.TokenType?.ToLower())
+ switch (_token?.TokenType?.ToLower())
{
case "bearer":
- return $"Bearer {response.AccessToken}";
+ return $"Bearer {_token.AccessToken}";
default:
- return $"{response.TokenType} {response.AccessToken}";
+ return $"{_token?.TokenType} {_token?.AccessToken}";
}
}
+
+ ///
+ /// Retrieves the authentication token (creating a new one if necessary) and adds it to the current request
+ ///
+ ///
+ ///
+ ///
+ public async ValueTask Authenticate(IRestClient client, RestRequest request)
+ => request.AddOrUpdateParameter(await GetAuthenticationParameter().ConfigureAwait(false));
}
}
diff --git a/samples/client/petstore/csharp/restsharp/net4.7/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs b/samples/client/petstore/csharp/restsharp/net4.7/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
index 0a94e17e1228..95e03c36e105 100644
--- a/samples/client/petstore/csharp/restsharp/net4.7/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
+++ b/samples/client/petstore/csharp/restsharp/net4.7/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
@@ -8,6 +8,7 @@
*/
+using System;
using Newtonsoft.Json;
namespace Org.OpenAPITools.Client.Auth
@@ -18,5 +19,14 @@ class TokenResponse
public string TokenType { get; set; }
[JsonProperty("access_token")]
public string AccessToken { get; set; }
+ [JsonProperty("expires_in")]
+ public int? ExpiresIn { get; set; }
+ [JsonProperty("created")]
+ public DateTime? Created { get; set; }
+
+ [JsonProperty("refresh_token")]
+ public string RefreshToken { get; set; }
+
+ public DateTime? ExpiresAt => ExpiresIn == null ? null : Created?.AddSeconds(ExpiresIn.Value);
}
}
\ No newline at end of file
diff --git a/samples/client/petstore/csharp/restsharp/net4.8/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs b/samples/client/petstore/csharp/restsharp/net4.8/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
index d7fb1293b34b..6c6817ef501a 100644
--- a/samples/client/petstore/csharp/restsharp/net4.8/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
+++ b/samples/client/petstore/csharp/restsharp/net4.8/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
@@ -19,8 +19,25 @@ namespace Org.OpenAPITools.Client.Auth
///
/// An authenticator for OAuth2 authentication flows
///
- public class OAuthAuthenticator : AuthenticatorBase
+ public class OAuthAuthenticator : IAuthenticator
{
+ private TokenResponse _token;
+
+ ///
+ /// Returns the current authentication token. Can return null if there is no authentication token, or it has expired.
+ ///
+ public string Token
+ {
+ get
+ {
+ if (_token == null) return null;
+ if (_token.ExpiresIn == null) return _token.AccessToken;
+ if (_token.ExpiresAt < DateTime.Now) return null;
+
+ return _token.AccessToken;
+ }
+ }
+
readonly string _tokenUrl;
readonly string _clientId;
readonly string _clientSecret;
@@ -39,7 +56,7 @@ public OAuthAuthenticator(
string scope,
OAuthFlow? flow,
JsonSerializerSettings serializerSettings,
- IReadableConfiguration configuration) : base("")
+ IReadableConfiguration configuration)
{
_tokenUrl = tokenUrl;
_clientId = clientId;
@@ -70,9 +87,8 @@ public OAuthAuthenticator(
///
/// Creates an authentication parameter from an access token.
///
- /// Access token to create a parameter from.
/// An authentication parameter.
- protected override async ValueTask GetAuthenticationParameter(string accessToken)
+ protected async ValueTask GetAuthenticationParameter()
{
var token = string.IsNullOrEmpty(Token) ? await GetToken().ConfigureAwait(false) : Token;
return new HeaderParameter(KnownHeaders.Authorization, token);
@@ -84,31 +100,45 @@ protected override async ValueTask GetAuthenticationParameter(string
/// An authentication token.
async Task GetToken()
{
- var client = new RestClient(_tokenUrl,
- configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
-
- var request = new RestRequest()
- .AddParameter("grant_type", _grantType)
- .AddParameter("client_id", _clientId)
- .AddParameter("client_secret", _clientSecret);
+ var client = new RestClient(_tokenUrl, configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
+ var request = new RestRequest();
+ if (!string.IsNullOrWhiteSpace(_token?.RefreshToken))
+ {
+ request.AddParameter("grant_type", "refresh_token")
+ .AddParameter("refresh_token", _token.RefreshToken);
+ }
+ else
+ {
+ request
+ .AddParameter("grant_type", _grantType)
+ .AddParameter("client_id", _clientId)
+ .AddParameter("client_secret", _clientSecret);
+ }
if (!string.IsNullOrEmpty(_scope))
{
request.AddParameter("scope", _scope);
}
-
- var response = await client.PostAsync(request).ConfigureAwait(false);
-
+ _token = await client.PostAsync(request).ConfigureAwait(false);
// RFC6749 - token_type is case insensitive.
// RFC6750 - In Authorization header Bearer should be capitalized.
// Fix the capitalization irrespective of token_type casing.
- switch (response.TokenType?.ToLower())
+ switch (_token?.TokenType?.ToLower())
{
case "bearer":
- return $"Bearer {response.AccessToken}";
+ return $"Bearer {_token.AccessToken}";
default:
- return $"{response.TokenType} {response.AccessToken}";
+ return $"{_token?.TokenType} {_token?.AccessToken}";
}
}
+
+ ///
+ /// Retrieves the authentication token (creating a new one if necessary) and adds it to the current request
+ ///
+ ///
+ ///
+ ///
+ public async ValueTask Authenticate(IRestClient client, RestRequest request)
+ => request.AddOrUpdateParameter(await GetAuthenticationParameter().ConfigureAwait(false));
}
}
diff --git a/samples/client/petstore/csharp/restsharp/net4.8/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs b/samples/client/petstore/csharp/restsharp/net4.8/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
index 0a94e17e1228..95e03c36e105 100644
--- a/samples/client/petstore/csharp/restsharp/net4.8/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
+++ b/samples/client/petstore/csharp/restsharp/net4.8/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
@@ -8,6 +8,7 @@
*/
+using System;
using Newtonsoft.Json;
namespace Org.OpenAPITools.Client.Auth
@@ -18,5 +19,14 @@ class TokenResponse
public string TokenType { get; set; }
[JsonProperty("access_token")]
public string AccessToken { get; set; }
+ [JsonProperty("expires_in")]
+ public int? ExpiresIn { get; set; }
+ [JsonProperty("created")]
+ public DateTime? Created { get; set; }
+
+ [JsonProperty("refresh_token")]
+ public string RefreshToken { get; set; }
+
+ public DateTime? ExpiresAt => ExpiresIn == null ? null : Created?.AddSeconds(ExpiresIn.Value);
}
}
\ No newline at end of file
diff --git a/samples/client/petstore/csharp/restsharp/net7/EnumMappings/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs b/samples/client/petstore/csharp/restsharp/net7/EnumMappings/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
index ce6261390c32..bcccf1e83f6f 100644
--- a/samples/client/petstore/csharp/restsharp/net7/EnumMappings/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
+++ b/samples/client/petstore/csharp/restsharp/net7/EnumMappings/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
@@ -19,8 +19,25 @@ namespace Org.OpenAPITools.Client.Auth
///
/// An authenticator for OAuth2 authentication flows
///
- public class OAuthAuthenticator : AuthenticatorBase
+ public class OAuthAuthenticator : IAuthenticator
{
+ private TokenResponse? _token;
+
+ ///
+ /// Returns the current authentication token. Can return null if there is no authentication token, or it has expired.
+ ///
+ public string? Token
+ {
+ get
+ {
+ if (_token == null) return null;
+ if (_token.ExpiresIn == null) return _token.AccessToken;
+ if (_token.ExpiresAt < DateTime.Now) return null;
+
+ return _token.AccessToken;
+ }
+ }
+
readonly string _tokenUrl;
readonly string _clientId;
readonly string _clientSecret;
@@ -39,7 +56,7 @@ public OAuthAuthenticator(
string? scope,
OAuthFlow? flow,
JsonSerializerSettings serializerSettings,
- IReadableConfiguration configuration) : base("")
+ IReadableConfiguration configuration)
{
_tokenUrl = tokenUrl;
_clientId = clientId;
@@ -70,9 +87,8 @@ public OAuthAuthenticator(
///
/// Creates an authentication parameter from an access token.
///
- /// Access token to create a parameter from.
/// An authentication parameter.
- protected override async ValueTask GetAuthenticationParameter(string accessToken)
+ protected async ValueTask GetAuthenticationParameter()
{
var token = string.IsNullOrEmpty(Token) ? await GetToken().ConfigureAwait(false) : Token;
return new HeaderParameter(KnownHeaders.Authorization, token);
@@ -84,31 +100,45 @@ protected override async ValueTask GetAuthenticationParameter(string
/// An authentication token.
async Task GetToken()
{
- var client = new RestClient(_tokenUrl,
- configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
-
- var request = new RestRequest()
- .AddParameter("grant_type", _grantType)
- .AddParameter("client_id", _clientId)
- .AddParameter("client_secret", _clientSecret);
+ var client = new RestClient(_tokenUrl, configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
+ var request = new RestRequest();
+ if (!string.IsNullOrWhiteSpace(_token?.RefreshToken))
+ {
+ request.AddParameter("grant_type", "refresh_token")
+ .AddParameter("refresh_token", _token.RefreshToken);
+ }
+ else
+ {
+ request
+ .AddParameter("grant_type", _grantType)
+ .AddParameter("client_id", _clientId)
+ .AddParameter("client_secret", _clientSecret);
+ }
if (!string.IsNullOrEmpty(_scope))
{
request.AddParameter("scope", _scope);
}
-
- var response = await client.PostAsync(request).ConfigureAwait(false);
-
+ _token = await client.PostAsync(request).ConfigureAwait(false);
// RFC6749 - token_type is case insensitive.
// RFC6750 - In Authorization header Bearer should be capitalized.
// Fix the capitalization irrespective of token_type casing.
- switch (response.TokenType?.ToLower())
+ switch (_token?.TokenType?.ToLower())
{
case "bearer":
- return $"Bearer {response.AccessToken}";
+ return $"Bearer {_token.AccessToken}";
default:
- return $"{response.TokenType} {response.AccessToken}";
+ return $"{_token?.TokenType} {_token?.AccessToken}";
}
}
+
+ ///
+ /// Retrieves the authentication token (creating a new one if necessary) and adds it to the current request
+ ///
+ ///
+ ///
+ ///
+ public async ValueTask Authenticate(IRestClient client, RestRequest request)
+ => request.AddOrUpdateParameter(await GetAuthenticationParameter().ConfigureAwait(false));
}
}
diff --git a/samples/client/petstore/csharp/restsharp/net7/EnumMappings/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs b/samples/client/petstore/csharp/restsharp/net7/EnumMappings/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
index 0a94e17e1228..da4f4499b1cc 100644
--- a/samples/client/petstore/csharp/restsharp/net7/EnumMappings/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
+++ b/samples/client/petstore/csharp/restsharp/net7/EnumMappings/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
@@ -8,6 +8,7 @@
*/
+using System;
using Newtonsoft.Json;
namespace Org.OpenAPITools.Client.Auth
@@ -18,5 +19,14 @@ class TokenResponse
public string TokenType { get; set; }
[JsonProperty("access_token")]
public string AccessToken { get; set; }
+ [JsonProperty("expires_in")]
+ public int? ExpiresIn { get; set; }
+ [JsonProperty("created")]
+ public DateTime? Created { get; set; }
+
+ [JsonProperty("refresh_token")]
+ public string? RefreshToken { get; set; }
+
+ public DateTime? ExpiresAt => ExpiresIn == null ? null : Created?.AddSeconds(ExpiresIn.Value);
}
}
\ No newline at end of file
diff --git a/samples/client/petstore/csharp/restsharp/net7/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs b/samples/client/petstore/csharp/restsharp/net7/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
index ce6261390c32..bcccf1e83f6f 100644
--- a/samples/client/petstore/csharp/restsharp/net7/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
+++ b/samples/client/petstore/csharp/restsharp/net7/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
@@ -19,8 +19,25 @@ namespace Org.OpenAPITools.Client.Auth
///
/// An authenticator for OAuth2 authentication flows
///
- public class OAuthAuthenticator : AuthenticatorBase
+ public class OAuthAuthenticator : IAuthenticator
{
+ private TokenResponse? _token;
+
+ ///
+ /// Returns the current authentication token. Can return null if there is no authentication token, or it has expired.
+ ///
+ public string? Token
+ {
+ get
+ {
+ if (_token == null) return null;
+ if (_token.ExpiresIn == null) return _token.AccessToken;
+ if (_token.ExpiresAt < DateTime.Now) return null;
+
+ return _token.AccessToken;
+ }
+ }
+
readonly string _tokenUrl;
readonly string _clientId;
readonly string _clientSecret;
@@ -39,7 +56,7 @@ public OAuthAuthenticator(
string? scope,
OAuthFlow? flow,
JsonSerializerSettings serializerSettings,
- IReadableConfiguration configuration) : base("")
+ IReadableConfiguration configuration)
{
_tokenUrl = tokenUrl;
_clientId = clientId;
@@ -70,9 +87,8 @@ public OAuthAuthenticator(
///
/// Creates an authentication parameter from an access token.
///
- /// Access token to create a parameter from.
/// An authentication parameter.
- protected override async ValueTask GetAuthenticationParameter(string accessToken)
+ protected async ValueTask GetAuthenticationParameter()
{
var token = string.IsNullOrEmpty(Token) ? await GetToken().ConfigureAwait(false) : Token;
return new HeaderParameter(KnownHeaders.Authorization, token);
@@ -84,31 +100,45 @@ protected override async ValueTask GetAuthenticationParameter(string
/// An authentication token.
async Task GetToken()
{
- var client = new RestClient(_tokenUrl,
- configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
-
- var request = new RestRequest()
- .AddParameter("grant_type", _grantType)
- .AddParameter("client_id", _clientId)
- .AddParameter("client_secret", _clientSecret);
+ var client = new RestClient(_tokenUrl, configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
+ var request = new RestRequest();
+ if (!string.IsNullOrWhiteSpace(_token?.RefreshToken))
+ {
+ request.AddParameter("grant_type", "refresh_token")
+ .AddParameter("refresh_token", _token.RefreshToken);
+ }
+ else
+ {
+ request
+ .AddParameter("grant_type", _grantType)
+ .AddParameter("client_id", _clientId)
+ .AddParameter("client_secret", _clientSecret);
+ }
if (!string.IsNullOrEmpty(_scope))
{
request.AddParameter("scope", _scope);
}
-
- var response = await client.PostAsync(request).ConfigureAwait(false);
-
+ _token = await client.PostAsync(request).ConfigureAwait(false);
// RFC6749 - token_type is case insensitive.
// RFC6750 - In Authorization header Bearer should be capitalized.
// Fix the capitalization irrespective of token_type casing.
- switch (response.TokenType?.ToLower())
+ switch (_token?.TokenType?.ToLower())
{
case "bearer":
- return $"Bearer {response.AccessToken}";
+ return $"Bearer {_token.AccessToken}";
default:
- return $"{response.TokenType} {response.AccessToken}";
+ return $"{_token?.TokenType} {_token?.AccessToken}";
}
}
+
+ ///
+ /// Retrieves the authentication token (creating a new one if necessary) and adds it to the current request
+ ///
+ ///
+ ///
+ ///
+ public async ValueTask Authenticate(IRestClient client, RestRequest request)
+ => request.AddOrUpdateParameter(await GetAuthenticationParameter().ConfigureAwait(false));
}
}
diff --git a/samples/client/petstore/csharp/restsharp/net7/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs b/samples/client/petstore/csharp/restsharp/net7/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
index 0a94e17e1228..da4f4499b1cc 100644
--- a/samples/client/petstore/csharp/restsharp/net7/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
+++ b/samples/client/petstore/csharp/restsharp/net7/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
@@ -8,6 +8,7 @@
*/
+using System;
using Newtonsoft.Json;
namespace Org.OpenAPITools.Client.Auth
@@ -18,5 +19,14 @@ class TokenResponse
public string TokenType { get; set; }
[JsonProperty("access_token")]
public string AccessToken { get; set; }
+ [JsonProperty("expires_in")]
+ public int? ExpiresIn { get; set; }
+ [JsonProperty("created")]
+ public DateTime? Created { get; set; }
+
+ [JsonProperty("refresh_token")]
+ public string? RefreshToken { get; set; }
+
+ public DateTime? ExpiresAt => ExpiresIn == null ? null : Created?.AddSeconds(ExpiresIn.Value);
}
}
\ No newline at end of file
diff --git a/samples/client/petstore/csharp/restsharp/standard2.0/ConditionalSerialization/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs b/samples/client/petstore/csharp/restsharp/standard2.0/ConditionalSerialization/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
index d7fb1293b34b..6c6817ef501a 100644
--- a/samples/client/petstore/csharp/restsharp/standard2.0/ConditionalSerialization/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
+++ b/samples/client/petstore/csharp/restsharp/standard2.0/ConditionalSerialization/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
@@ -19,8 +19,25 @@ namespace Org.OpenAPITools.Client.Auth
///
/// An authenticator for OAuth2 authentication flows
///
- public class OAuthAuthenticator : AuthenticatorBase
+ public class OAuthAuthenticator : IAuthenticator
{
+ private TokenResponse _token;
+
+ ///
+ /// Returns the current authentication token. Can return null if there is no authentication token, or it has expired.
+ ///
+ public string Token
+ {
+ get
+ {
+ if (_token == null) return null;
+ if (_token.ExpiresIn == null) return _token.AccessToken;
+ if (_token.ExpiresAt < DateTime.Now) return null;
+
+ return _token.AccessToken;
+ }
+ }
+
readonly string _tokenUrl;
readonly string _clientId;
readonly string _clientSecret;
@@ -39,7 +56,7 @@ public OAuthAuthenticator(
string scope,
OAuthFlow? flow,
JsonSerializerSettings serializerSettings,
- IReadableConfiguration configuration) : base("")
+ IReadableConfiguration configuration)
{
_tokenUrl = tokenUrl;
_clientId = clientId;
@@ -70,9 +87,8 @@ public OAuthAuthenticator(
///
/// Creates an authentication parameter from an access token.
///
- /// Access token to create a parameter from.
/// An authentication parameter.
- protected override async ValueTask GetAuthenticationParameter(string accessToken)
+ protected async ValueTask GetAuthenticationParameter()
{
var token = string.IsNullOrEmpty(Token) ? await GetToken().ConfigureAwait(false) : Token;
return new HeaderParameter(KnownHeaders.Authorization, token);
@@ -84,31 +100,45 @@ protected override async ValueTask GetAuthenticationParameter(string
/// An authentication token.
async Task GetToken()
{
- var client = new RestClient(_tokenUrl,
- configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
-
- var request = new RestRequest()
- .AddParameter("grant_type", _grantType)
- .AddParameter("client_id", _clientId)
- .AddParameter("client_secret", _clientSecret);
+ var client = new RestClient(_tokenUrl, configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
+ var request = new RestRequest();
+ if (!string.IsNullOrWhiteSpace(_token?.RefreshToken))
+ {
+ request.AddParameter("grant_type", "refresh_token")
+ .AddParameter("refresh_token", _token.RefreshToken);
+ }
+ else
+ {
+ request
+ .AddParameter("grant_type", _grantType)
+ .AddParameter("client_id", _clientId)
+ .AddParameter("client_secret", _clientSecret);
+ }
if (!string.IsNullOrEmpty(_scope))
{
request.AddParameter("scope", _scope);
}
-
- var response = await client.PostAsync(request).ConfigureAwait(false);
-
+ _token = await client.PostAsync(request).ConfigureAwait(false);
// RFC6749 - token_type is case insensitive.
// RFC6750 - In Authorization header Bearer should be capitalized.
// Fix the capitalization irrespective of token_type casing.
- switch (response.TokenType?.ToLower())
+ switch (_token?.TokenType?.ToLower())
{
case "bearer":
- return $"Bearer {response.AccessToken}";
+ return $"Bearer {_token.AccessToken}";
default:
- return $"{response.TokenType} {response.AccessToken}";
+ return $"{_token?.TokenType} {_token?.AccessToken}";
}
}
+
+ ///
+ /// Retrieves the authentication token (creating a new one if necessary) and adds it to the current request
+ ///
+ ///
+ ///
+ ///
+ public async ValueTask Authenticate(IRestClient client, RestRequest request)
+ => request.AddOrUpdateParameter(await GetAuthenticationParameter().ConfigureAwait(false));
}
}
diff --git a/samples/client/petstore/csharp/restsharp/standard2.0/ConditionalSerialization/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs b/samples/client/petstore/csharp/restsharp/standard2.0/ConditionalSerialization/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
index 0a94e17e1228..95e03c36e105 100644
--- a/samples/client/petstore/csharp/restsharp/standard2.0/ConditionalSerialization/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
+++ b/samples/client/petstore/csharp/restsharp/standard2.0/ConditionalSerialization/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
@@ -8,6 +8,7 @@
*/
+using System;
using Newtonsoft.Json;
namespace Org.OpenAPITools.Client.Auth
@@ -18,5 +19,14 @@ class TokenResponse
public string TokenType { get; set; }
[JsonProperty("access_token")]
public string AccessToken { get; set; }
+ [JsonProperty("expires_in")]
+ public int? ExpiresIn { get; set; }
+ [JsonProperty("created")]
+ public DateTime? Created { get; set; }
+
+ [JsonProperty("refresh_token")]
+ public string RefreshToken { get; set; }
+
+ public DateTime? ExpiresAt => ExpiresIn == null ? null : Created?.AddSeconds(ExpiresIn.Value);
}
}
\ No newline at end of file
diff --git a/samples/client/petstore/csharp/restsharp/standard2.0/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs b/samples/client/petstore/csharp/restsharp/standard2.0/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
index d7fb1293b34b..6c6817ef501a 100644
--- a/samples/client/petstore/csharp/restsharp/standard2.0/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
+++ b/samples/client/petstore/csharp/restsharp/standard2.0/Petstore/src/Org.OpenAPITools/Client/Auth/OAuthAuthenticator.cs
@@ -19,8 +19,25 @@ namespace Org.OpenAPITools.Client.Auth
///
/// An authenticator for OAuth2 authentication flows
///
- public class OAuthAuthenticator : AuthenticatorBase
+ public class OAuthAuthenticator : IAuthenticator
{
+ private TokenResponse _token;
+
+ ///
+ /// Returns the current authentication token. Can return null if there is no authentication token, or it has expired.
+ ///
+ public string Token
+ {
+ get
+ {
+ if (_token == null) return null;
+ if (_token.ExpiresIn == null) return _token.AccessToken;
+ if (_token.ExpiresAt < DateTime.Now) return null;
+
+ return _token.AccessToken;
+ }
+ }
+
readonly string _tokenUrl;
readonly string _clientId;
readonly string _clientSecret;
@@ -39,7 +56,7 @@ public OAuthAuthenticator(
string scope,
OAuthFlow? flow,
JsonSerializerSettings serializerSettings,
- IReadableConfiguration configuration) : base("")
+ IReadableConfiguration configuration)
{
_tokenUrl = tokenUrl;
_clientId = clientId;
@@ -70,9 +87,8 @@ public OAuthAuthenticator(
///
/// Creates an authentication parameter from an access token.
///
- /// Access token to create a parameter from.
/// An authentication parameter.
- protected override async ValueTask GetAuthenticationParameter(string accessToken)
+ protected async ValueTask GetAuthenticationParameter()
{
var token = string.IsNullOrEmpty(Token) ? await GetToken().ConfigureAwait(false) : Token;
return new HeaderParameter(KnownHeaders.Authorization, token);
@@ -84,31 +100,45 @@ protected override async ValueTask GetAuthenticationParameter(string
/// An authentication token.
async Task GetToken()
{
- var client = new RestClient(_tokenUrl,
- configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
-
- var request = new RestRequest()
- .AddParameter("grant_type", _grantType)
- .AddParameter("client_id", _clientId)
- .AddParameter("client_secret", _clientSecret);
+ var client = new RestClient(_tokenUrl, configureSerialization: serializerConfig => serializerConfig.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration)));
+ var request = new RestRequest();
+ if (!string.IsNullOrWhiteSpace(_token?.RefreshToken))
+ {
+ request.AddParameter("grant_type", "refresh_token")
+ .AddParameter("refresh_token", _token.RefreshToken);
+ }
+ else
+ {
+ request
+ .AddParameter("grant_type", _grantType)
+ .AddParameter("client_id", _clientId)
+ .AddParameter("client_secret", _clientSecret);
+ }
if (!string.IsNullOrEmpty(_scope))
{
request.AddParameter("scope", _scope);
}
-
- var response = await client.PostAsync(request).ConfigureAwait(false);
-
+ _token = await client.PostAsync(request).ConfigureAwait(false);
// RFC6749 - token_type is case insensitive.
// RFC6750 - In Authorization header Bearer should be capitalized.
// Fix the capitalization irrespective of token_type casing.
- switch (response.TokenType?.ToLower())
+ switch (_token?.TokenType?.ToLower())
{
case "bearer":
- return $"Bearer {response.AccessToken}";
+ return $"Bearer {_token.AccessToken}";
default:
- return $"{response.TokenType} {response.AccessToken}";
+ return $"{_token?.TokenType} {_token?.AccessToken}";
}
}
+
+ ///
+ /// Retrieves the authentication token (creating a new one if necessary) and adds it to the current request
+ ///
+ ///
+ ///
+ ///
+ public async ValueTask Authenticate(IRestClient client, RestRequest request)
+ => request.AddOrUpdateParameter(await GetAuthenticationParameter().ConfigureAwait(false));
}
}
diff --git a/samples/client/petstore/csharp/restsharp/standard2.0/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs b/samples/client/petstore/csharp/restsharp/standard2.0/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
index 0a94e17e1228..95e03c36e105 100644
--- a/samples/client/petstore/csharp/restsharp/standard2.0/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
+++ b/samples/client/petstore/csharp/restsharp/standard2.0/Petstore/src/Org.OpenAPITools/Client/Auth/TokenResponse.cs
@@ -8,6 +8,7 @@
*/
+using System;
using Newtonsoft.Json;
namespace Org.OpenAPITools.Client.Auth
@@ -18,5 +19,14 @@ class TokenResponse
public string TokenType { get; set; }
[JsonProperty("access_token")]
public string AccessToken { get; set; }
+ [JsonProperty("expires_in")]
+ public int? ExpiresIn { get; set; }
+ [JsonProperty("created")]
+ public DateTime? Created { get; set; }
+
+ [JsonProperty("refresh_token")]
+ public string RefreshToken { get; set; }
+
+ public DateTime? ExpiresAt => ExpiresIn == null ? null : Created?.AddSeconds(ExpiresIn.Value);
}
}
\ No newline at end of file