Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,11 @@ OPTIONS:
--no-inline-json-converters Don't inline JsonConverter attributes for enum properties. When disabled, enum properties will not have [JsonConverter(typeof(JsonStringEnumConverter))] attributes
--integer-type int The .NET type to use for OpenAPI integer types without a format specifier. Common values: 'int' (default), 'long'
--custom-template-directory Custom directory with NSwag fluid templates for code generation. Default is null which uses the default NSwag templates. See <https://github.com/RicoSuter/NSwag/wiki/Templates>
--generate-authentication-header None Controls generation of Authorization header support.
Options: None (no authentication code is generated),
Parameter (adds method parameters for authentication),
Method (generates a Refit [Headers] attribute for bearer token authentication)
--security-scheme Generate Authorization header for a specific security scheme. When omitted, authentication headers will be generated for all security schemes
```

To generate code from an OpenAPI specifications file, run the following:
Expand Down
13 changes: 13 additions & 0 deletions docs/json-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,19 @@
},
"parameterNameGenerator": {
"$ref": "#/definitions/IParameterNameGenerator"
},
"authenticationHeaderStyle": {
"description": "Controls generation of Authorization header support. Options: None (no authentication code is generated), Parameter (adds method parameters for authentication), Method (generates a Refit [Headers] attribute for bearer token authentication). Default is None.",
"type": "string",
"enum": [
"None",
"Method",
"Parameter"
]
},
"securityScheme": {
"description": "Security scheme for which to generate authentication headers. When omitted, authentication headers will be generated for all security schemes.",
"type": "string"
}
}
}
5 changes: 3 additions & 2 deletions src/Refitter.Core/ParameterExtractor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,10 @@ public static IEnumerable<string> GetParameters(
{
headerParameters.Add($"[Header(\"{securityScheme.Name}\")] string {ReplaceUnsafeCharacters(securityScheme.Name)}");
}
else if (securityScheme is { Type: OpenApiSecuritySchemeType.Http, Scheme: "bearer" })
else if (securityScheme is { Type: OpenApiSecuritySchemeType.Http }
&& string.Equals(securityScheme.Scheme, "bearer", StringComparison.OrdinalIgnoreCase))
{
headerParameters.Add($@"[Header(""Authorization: Bearer"" )] string bearerToken");
headerParameters.Add($@"[Header(""Authorization: Bearer"")] string bearerToken");
}
}
}
Expand Down
5 changes: 3 additions & 2 deletions src/Refitter.Core/RefitInterfaceGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ protected void GenerateHeaders(
}
}

if (settings.AuthenticationHeaderStyle == AuthenticationHeaderStyle.Method)
if (settings.AuthenticationHeaderStyle == AuthenticationHeaderStyle.Method)
{
foreach (var securitySchemeName in operationModel.Security.SelectMany(x => x.Keys))
{
Expand All @@ -290,7 +290,8 @@ protected void GenerateHeaders(
continue;
}

if (securityScheme is { Type: OpenApiSecuritySchemeType.Http, Scheme: "bearer" })
if (securityScheme is { Type: OpenApiSecuritySchemeType.Http, Scheme: var scheme }
&& string.Equals(scheme, "bearer", StringComparison.OrdinalIgnoreCase))
{
headers.Add("\"Authorization: Bearer\"");
}
Expand Down
5 changes: 3 additions & 2 deletions src/Refitter.Core/Settings/AuthenticationHeaderStyle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ namespace Refitter.Core;
/// The Authentication header style to use.
/// </summary>
[Description("The Authentication header style to use")]
public enum AuthenticationHeaderStyle {
public enum AuthenticationHeaderStyle
{
/// <summary>
/// Do not generate any "Authorization" header attributes.
/// </summary>
Expand All @@ -21,4 +22,4 @@ public enum AuthenticationHeaderStyle {
/// Generate a "Authorization" header as a method parameter attribute.
/// </summary>
Parameter,
}
}
6 changes: 6 additions & 0 deletions src/Refitter.Core/Settings/RefitGeneratorSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,7 @@ payloads with (yet) unknown types are offered by newer versions of an API
/// Gets or sets a value indicating whether to generate Security Schema Authentication headers.
/// </summary>
[Description("Generate Security Schema Authentication headers")]
[JsonConverter(typeof(JsonStringEnumConverter))]
public AuthenticationHeaderStyle AuthenticationHeaderStyle { get; set; }

/// <summary>
Expand All @@ -402,8 +403,13 @@ payloads with (yet) unknown types are offered by newer versions of an API
[Description("Custom directory with NSwag fluid templates for code generation. Default is null which uses the default NSwag templates. See https://github.com/RicoSuter/NSwag/wiki/Templates")]
public string? CustomTemplateDirectory { get; set; }

/// <summary>
/// Gets or sets the security scheme name for which to generate authentication headers.
/// When specified, only endpoints using this security scheme will have authentication headers generated.
/// </summary>
[Description("Security scheme for which to generate authentication headers.")]
public string? SecurityScheme { get; set; }

/// <summary>
/// Gets or sets a value indicating whether to generate JsonSerializerContext for AOT compilation support.
/// </summary>
Expand Down
39 changes: 39 additions & 0 deletions src/Refitter.Tests/Resources/EmbeddedResources.cs
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,39 @@ public static string SwaggerPetstoreYamlV3WithUnsafeAuthenticationHeaders
}
}

public static string SwaggerPetstoreJsonV3WithBearerAuthenticationHeaders
{
get
{
using var stream = GetStream("V3.SwaggerPetstoreWithBearerAuthenticationHeaders.json");
using var reader = new StreamReader(stream);

return reader.ReadToEnd();
}
}

public static string SwaggerPetstoreYamlV3WithBearerAuthenticationHeaders
{
get
{
using var stream = GetStream("V3.SwaggerPetstoreWithBearerAuthenticationHeaders.yaml");
using var reader = new StreamReader(stream);

return reader.ReadToEnd();
}
}

public static string SwaggerPetstoreJsonV3WithMixedAuthenticationHeaders
{
get
{
using var stream = GetStream("V3.SwaggerPetstoreWithMixedAuthenticationHeaders.json");
using var reader = new StreamReader(stream);

return reader.ReadToEnd();
}
}

public static string SwaggerIllegalPathsJsonV3
{
get
Expand Down Expand Up @@ -238,6 +271,12 @@ public static string GetSwaggerPetstore(SampleOpenSpecifications version)
SwaggerPetstoreYamlV2WithUnsafeAuthenticationHeaders,
SampleOpenSpecifications.SwaggerPetstoreYamlV3WithUnsafeAuthenticationHeaders =>
SwaggerPetstoreYamlV3WithUnsafeAuthenticationHeaders,
SampleOpenSpecifications.SwaggerPetstoreJsonV3WithBearerAuthenticationHeaders =>
SwaggerPetstoreJsonV3WithBearerAuthenticationHeaders,
SampleOpenSpecifications.SwaggerPetstoreYamlV3WithBearerAuthenticationHeaders =>
SwaggerPetstoreYamlV3WithBearerAuthenticationHeaders,
SampleOpenSpecifications.SwaggerPetstoreJsonV3WithMixedAuthenticationHeaders =>
SwaggerPetstoreJsonV3WithMixedAuthenticationHeaders,
_ => throw new ArgumentOutOfRangeException(nameof(version), version, null)
};
}
Expand Down
3 changes: 3 additions & 0 deletions src/Refitter.Tests/Resources/SampleOpenSpecifications.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,8 @@ public enum SampleOpenSpecifications
SwaggerPetstoreJsonV3WithUnsafeAuthenticationHeaders,
SwaggerPetstoreYamlV2WithUnsafeAuthenticationHeaders,
SwaggerPetstoreYamlV3WithUnsafeAuthenticationHeaders,
SwaggerPetstoreJsonV3WithBearerAuthenticationHeaders,
SwaggerPetstoreYamlV3WithBearerAuthenticationHeaders,
SwaggerPetstoreJsonV3WithMixedAuthenticationHeaders,
IllegalPathsJsonV3
}
Loading
Loading