Skip to content

Commit 8ff3d23

Browse files
Copilotbaywet
andcommitted
Add DeviceAuthorization field to OpenApiOAuthFlows with v3.2 support and v3.1/v3.0 extension
Co-authored-by: baywet <7905502+baywet@users.noreply.github.com>
1 parent f84e5de commit 8ff3d23

File tree

5 files changed

+31
-1
lines changed

5 files changed

+31
-1
lines changed

src/Microsoft.OpenApi/Models/OpenApiConstants.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,11 @@ public static class OpenApiConstants
560560
/// </summary>
561561
public const string AuthorizationCode = "authorizationCode";
562562

563+
/// <summary>
564+
/// Field: DeviceAuthorization
565+
/// </summary>
566+
public const string DeviceAuthorization = "deviceAuthorization";
567+
563568
/// <summary>
564569
/// Field: AuthorizationUrl
565570
/// </summary>

src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ public class OpenApiOAuthFlows : IOpenApiSerializable, IOpenApiExtensible
3131
/// </summary>
3232
public OpenApiOAuthFlow? AuthorizationCode { get; set; }
3333

34+
/// <summary>
35+
/// Configuration for the OAuth Device Authorization flow.
36+
/// </summary>
37+
public OpenApiOAuthFlow? DeviceAuthorization { get; set; }
38+
3439
/// <summary>
3540
/// Specification Extensions.
3641
/// </summary>
@@ -51,6 +56,7 @@ public OpenApiOAuthFlows(OpenApiOAuthFlows oAuthFlows)
5156
Password = oAuthFlows?.Password != null ? new(oAuthFlows.Password) : null;
5257
ClientCredentials = oAuthFlows?.ClientCredentials != null ? new(oAuthFlows.ClientCredentials) : null;
5358
AuthorizationCode = oAuthFlows?.AuthorizationCode != null ? new(oAuthFlows.AuthorizationCode) : null;
59+
DeviceAuthorization = oAuthFlows?.DeviceAuthorization != null ? new(oAuthFlows.DeviceAuthorization) : null;
5460
Extensions = oAuthFlows?.Extensions != null ? new Dictionary<string, IOpenApiExtension>(oAuthFlows.Extensions) : null;
5561
}
5662

@@ -106,6 +112,22 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
106112
AuthorizationCode,
107113
callback);
108114

115+
// deviceAuthorization - only for v3.2+, otherwise as extension
116+
if (version >= OpenApiSpecVersion.OpenApi3_2)
117+
{
118+
writer.WriteOptionalObject(
119+
OpenApiConstants.DeviceAuthorization,
120+
DeviceAuthorization,
121+
callback);
122+
}
123+
else if (DeviceAuthorization is not null)
124+
{
125+
writer.WriteOptionalObject(
126+
OpenApiConstants.ExtensionFieldNamePrefix + "oai-" + OpenApiConstants.DeviceAuthorization,
127+
DeviceAuthorization,
128+
callback);
129+
}
130+
109131
// extensions
110132
writer.WriteExtensions(Extensions, version);
111133

src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowsDeserializer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ internal static partial class OpenApiV3Deserializer
2323
private static readonly PatternFieldMap<OpenApiOAuthFlows> _oAuthFlowsPatternFields =
2424
new()
2525
{
26+
{s => s.Equals("x-oai-deviceAuthorization", StringComparison.OrdinalIgnoreCase), (o, p, n, t) => o.DeviceAuthorization = LoadOAuthFlow(n, t)},
2627
{s => s.StartsWith(OpenApiConstants.ExtensionFieldNamePrefix, StringComparison.OrdinalIgnoreCase), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
2728
};
2829

src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowsDeserializer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ internal static partial class OpenApiV31Deserializer
2020
private static readonly PatternFieldMap<OpenApiOAuthFlows> _oAuthFlowsPatternFields =
2121
new()
2222
{
23+
{s => s.Equals("x-oai-deviceAuthorization", StringComparison.OrdinalIgnoreCase), (o, p, n, t) => o.DeviceAuthorization = LoadOAuthFlow(n, t)},
2324
{s => s.StartsWith(OpenApiConstants.ExtensionFieldNamePrefix, StringComparison.OrdinalIgnoreCase), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
2425
};
2526

src/Microsoft.OpenApi/Reader/V32/OpenApiOAuthFlowsDeserializer.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ internal static partial class OpenApiV32Deserializer
1414
{"implicit", (o, n, t) => o.Implicit = LoadOAuthFlow(n, t)},
1515
{"password", (o, n, t) => o.Password = LoadOAuthFlow(n, t)},
1616
{"clientCredentials", (o, n, t) => o.ClientCredentials = LoadOAuthFlow(n, t)},
17-
{"authorizationCode", (o, n, t) => o.AuthorizationCode = LoadOAuthFlow(n, t)}
17+
{"authorizationCode", (o, n, t) => o.AuthorizationCode = LoadOAuthFlow(n, t)},
18+
{"deviceAuthorization", (o, n, t) => o.DeviceAuthorization = LoadOAuthFlow(n, t)}
1819
};
1920

2021
private static readonly PatternFieldMap<OpenApiOAuthFlows> _oAuthFlowsPatternFields =

0 commit comments

Comments
 (0)